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.