Przerabiamy temat po raz kolejny plus zdobywamy nowe umiejętności. Kontynuacja lekcji poprzednich. Do dzieła.

Ok, najpierw utworzymy nowy model, migrację, fabrykę i seeder:

php artisan make:model Address -mfs

Teraz idziemy do migracji:

return new class extends Migration
{
    /**
     * Run the migrations.
     */
    public function up(): void
    {
        Schema::create('addresses', function (Blueprint $table) {
            $table->id();
            $table->timestamps();
            $table->unsignedBigInteger('person_id');
            $table->string('city');
            $table->string('street');
            $table->foreign('person_id')->references('id')->on('people');
        });
    }

    /**
     * Reverse the migrations.
     */
    public function down(): void
    {
        Schema::dropIfExists('addresses');
    }
};

Nie robimy tego po raz pierwszy, więc nic tu nie powinno dziwić. Teraz przechodzimy do modelu:

use App\Models\Person;
class Address extends Model
{
    use HasFactory;

    protected $fillable = ['city', 'street'];

    public function person()
    {
        return $this->belongsTo(Person::class);
    }
}

Jeżeli cokolwiek nas dziwi powinniśmy raz jeszcze przerobić materiał o Laravelu, to tylko przypomnienie.

Teraz druga strona relacji:

use App\Models\Address;
class Person extends Model
{
    protected $fillable = ['firstName', 'lastName', 'age'];
    
    use HasFactory;

    // public function fullname(){
    //     return $this->firstName . " " . $this->lastName;
    // }

    public function makeOlder($by=1){
        $this->age += $by;
        $this->save();
    }

    protected function fullName(): Attribute
    {
        return Attribute::make(
            get: fn () => $this->firstName . " " . $this->lastName,
        );
    }

    public function address() 
    {
        return $this->hasOne(Address::class);
    }

}

Ok, jesteśmy gotowi zrobić migrate:

php artisan migrate

Teraz przejdźmy do console, zaimportujmy tam Person i Address i dodajmy te komendy:

Artisan::command('hasaddr', function () {
    $cnt = Person::has('address')->count();
    $this->comment("There are $cnt profiles with address");
});

Artisan::command('hasnoaddr', function () {
    $cnt = Person::doesntHave('address')->count();
    $this->comment("There are $cnt profiles without address");
});

Artisan::command('peoplecount', function () {
    $all = Person::count();
    $this->comment("There are $all people");
});

Jeżeli nie rozumiemy co tu się dzieje, albo nie pamiętamy jak to odpalić (php artisan nazwa-komendy) to znaczy, że słabo przerobiliśmy poprzedni materiał, do którego odsyłam (Laravel – relacje).

Teraz tylko powtarzamy na ostatnim projekcie, aby wykonać kilka ćwiczeń z nowymi tematami, których wcześniej nie było, ale podstawy musimy mieć opanowane.