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.