Przypominamy sobie jak zapisać relację 1 do 1 od dwóch stron oraz jak ją załadować. Będzie potrzebne do następnych zajęć.

Ok, oto nasz model:

//(...)

use App\Models\Address;

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

    //(...)

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

}

On posiada adres. Na metodzie address można wykonać metodę save i przekazać instancję modelu Address utworzoną w pamięci:

Artisan::command('add-address {id}', function (int $id) {

    $person = Person::findOrFail($id);

    $city = $this->ask('Enter city: ');
    $street = $this->ask('Enter street: ');
    
    $addr = new Address(['city' => $city, 'street' => $street]);

    $person->address()->save($addr);


    $this->comment("Name: {$person->firstName} {$person->lastName}");
    $this->comment("Age: {$person->age}");
    $this->comment("Created at: {$person->created_at}");
});

Mam nadzieję, że wszystko jasne, bo tak w zasadzie robimy powtórkę z materiału. Teraz model Address:

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

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

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

Jest posiadany przez model Person. I metoda person posiada metodę associate, do której można przekazać obiekt klasy Person, następnie wykonać save:

Artisan::command('assoc-address {id}', function (int $id) {

    $person = Person::findOrFail($id);

    $city = $this->ask('Enter city: ');
    $street = $this->ask('Enter street: ');
    
    $addr = new Address(['city' => $city, 'street' => $street]);

    $addr->person()->associate($person)->save();


    $this->comment("Name: {$person->firstName} {$person->lastName}");
    $this->comment("Age: {$person->age}");
    $this->comment("Created at: {$person->created_at}");
});

Save jest obowiązkowy, nawet jak person już w bazie danych istnieje.

Ok, teraz załadujmy sobie obiekt z relacją i wyświetlmy:

Artisan::command('with-address {id}', function (int $id) {

    $person = Person::with('address')->findOrFail($id);

    $this->comment("Name: {$person->firstName} {$person->lastName}");
    $this->comment("Age: {$person->age}");
    $this->comment("Created at: {$person->created_at}");

    if($person->address){
        $this->comment("City: {$person->address->city}");
        $this->comment("Street: {$person->address->street}");
    }
    
});

Jeżeli nic nas tutaj nie dziwi, to znaczy, że dobrze pamiętamy materiał i możemy kontynuować następne lekcje.