Шпаргалка для Laravel Eloquent ORM 5.5
ассоциация один на один
Детали примера:
В этой демонстрации у нас есть 2 модели (владелец и автомобиль) и две таблицы (владельцы и автомобили).
Бизнес-логика:
Пользователь может владеть автомобилем.
У автомобиля может быть один владелец.
Диаграмма корреляции:
Детали ссылки:
В таблице Cars должен храниться идентификатор владельца.
Красноречивая модель:
class Owner
{
public function car()
{
return $this->hasOne(Car::class);
}
}
class Car
{
public function owner()
{
return $this->belongsTo(Owner::class);
}
}
перенос данных:
Schema::create('owners', function (Blueprint $table) {
$table->increments('id');
$table->string('name');
});
Schema::create('cars', function (Blueprint $table) {
$table->increments('id');
$table->string('name');
$table->integer('owner_id')->unsigned()->index()->nullable();
$table->foreign('owner_id')->references('id')->on('owners');
});
Хранить записи:
// 在 Owner 及 Car 之间建立关联
$owner->car()->save($car);
// 在 Car 及 Owner 之间建立关联
$car->owner()->associate($owner)->save();
Получить записи:
// 取得 Owner Car
$owner->car;
// 取得 Car Owner
$car->owner;
ассоциация "один ко многим"
Детали примера:
В этом примере у нас есть две модели: Thief (вор) и Car (машина), и две таблицы: воры и машины.
Бизнес правила:
Воры могут украсть более одного автомобиля. Машину может украсть только вор.
диаграмма отношений:
Детали отношений:
В таблице транспортных средств должен храниться идентификатор вора.
Красноречивая модель:
class Thief
{
public function cars()
{
return $this->hasMany(Car::class);
}
}
class Car
{
public function thief()
{
return $this->belongsTo(Thief::class);
}
}
перенос данных:
Schema::create('thieves', function (Blueprint $table) {
$table->increments('id');
$table->string('name');
});
Schema::create('cars', function (Blueprint $table) {
$table->increments('id');
$table->string('name');
$table->integer('thief_id')->unsigned()->index()->nullable();
$table->foreign('thief_id')->references('id')->on('thieves');
});
Хранение записей:
// 创建介于小偷与车之间的关联。
$thief->cars()->saveMany([
$car1,
$car2,
]);
// 或者在单一模型调用 save() 方法。
$thief->cars()->save($car);
// 创建介于 Car 和 Thief 的关联。
$car->thief()->associate($thief)->save();
Потяните запись:
// 获取小偷所偷的车
$thief->cars;
// 获取偷盗某辆车的小偷
$car->thief;
Полиморфизм
Детали демо:
В этой демонстрации у нас есть три модели (мужчина, женщина и машина) и три таблицы (мужчина, женщина и машина).
Бизнес правила:
Человек (покупатель) может купить много автомобилей. Женщина (покупатель) может купить много автомобилей. Этот автомобиль может быть приобретен одним покупателем (мужчиной или женщиной).
диаграмма отношений:
Детали отношений:
В таблице Car должны храниться идентификатор покупателя и тип покупателя."покупатель" - это набор имён моделей (мужчина и женщина), не ограничивается только двумя, тип покупателя - настоящее имя модели.
Красноречивые модели:
class Man
{
public function cars()
{
return $this->morphMany(Car::class, 'buyer');
}
}
class Woman
{
public function cars()
{
return $this->morphMany(Car::class, 'buyer');
}
}
class Car
{
public function buyer()
{
return $this->morphTo();
}
}
Миграция базы данных:
Schema::create('men', function (Blueprint $table) {
$table->increments('id');
$table->string('name');
});
Schema::create('women', function (Blueprint $table) {
$table->increments('id');
$table->string('name');
});
Schema::create('cars', function (Blueprint $table) {
$table->increments('id');
$table->string('name');
$table->integer('buyer_id')->unsigned()->index()->nullable();
$table->string('buyer_type')->nullable();
// 或者使用 $table->morphs(‘buyer’); 代替 "buyer_id" 和 "buyer_type"
});
Запись хранения:
// 在买家 (男人 / 女人) 和汽车之间建立联系。
$man->cars()->saveMany([
$car1,
$car2,
]);
$woman->cars()->saveMany([
$car1,
$car2,
]);
// 或者为单个模型使用 save() 函数。
$man->cars()->save($car);
$woman->cars()->save($car);
//创建汽车与买家之间的关系 ( 男人/女人 )。
$car1->buyer()->associate($man)->save();
$car2->buyer()->associate($woman)->save();
Получение записей:
// 获取买家 (男人 / 女人)的汽车
$men->cars
$women->cars
// 获取这辆车的买家 (男人 / 女人)
$car->buyer
Ассоциация «многие ко многим»
Пример шоу:
В этом примере у нас есть две модели (Водитель и Автомобиль) и три таблицы. (drivers, промежуточная таблица ассоциаций с именем car_driver).
Бизнес правила:
Один водитель может управлять несколькими автомобилями. Машиной могут управлять многие водители.
диаграмма отношений:
Детали ссылки:
Таблица ассоциаций "car_driver" должна содержать идентификатор водителя и идентификатор автомобиля.
Ассоциативная модель:
class Driver
{
public function cars()
{
return $this->belongsToMany(Car::class);
}
}
class Car
{
public function drivers()
{
return $this->belongsToMany(Driver::class);
}
}
Миграция базы данных:
Schema::create('drivers', function (Blueprint $table) {
$table->increments('id');
$table->string('name');
});
Schema::create('cars', function (Blueprint $table) {
$table->increments('id');
$table->string('name');
});
Schema::create('car_driver', function (Blueprint $table) {
$table->increments('id');
$table->integer('car_id')->unsigned()->index();
$table->foreign('car_id')->references('id')->on('cars')->onDelete('cascade');
$table->integer('driver_id')->unsigned()->index();
$table->foreign('driver_id')->references('id')->on('drivers')->onDelete('cascade');
});
Вести учет:
//创建Driver和Car之间的关联。
$driver->cars()->attach([
$car1->id,
$car2->id,
]);
//或者使用sync()函数防止重复关联。
$driver->cars()->sync([
$car1->id,
$car2->id,
]);
//创建Car和Driver之间的关联。
$car->drivers()->attach([
$driver1->id,
$driver2->id,
]);
//或者使用sync()函数防止重复关联。
$car->drivers()->sync([
$driver1->id,
$driver2->id,
]);
Запись поиска:
// Get Driver Car
$driver->cars
// Get Car Drivers
$car->drivers
Полиморфная ассоциация «многие ко многим»
Показать детали:
В этой демонстрации у нас есть три модели (камердинер, владелец и автомобиль) и 4 таблицы (камердинер, владельцы, автомобили и водители).
Бизнес-логика:
Один шофер (водитель) может управлять несколькими автомобилями
Один автовладелец (водитель) может управлять несколькими автомобилями
Автомобилем могут управлять несколько водителей (шофер и/или владелец)
Ассоциативный граф
Детали ссылки:
Промежуточная таблица «водители» должна хранить идентификатор водителя, тип водителя и идентификатор транспортного средства.
Вождение — это код для набора моделей (камердинер и владелец) и не ограничивается двумя моделями. Тип драйвера - настоящее название модели.
Красноречивые модели:
class Valet
{
public function cars()
{
return $this->morphToMany(Car::class, 'driver');
}
}
class Owner
{
public function cars()
{
return $this->morphToMany(Car::class, 'driver');
}
}
class Car
{
public function valets()
{
return $this->morphedByMany(Valet::class, 'driver');
}
public function owners()
{
return $this->morphedByMany(Owner::class, 'driver');
}
}
перенос данных:
Schema::create('valets', function (Blueprint $table) {
$table->increments('id');
$table->string('name');
});
Schema::create('owners', function (Blueprint $table) {
$table->increments('id');
$table->string('name');
});
Schema::create('drivers', function (Blueprint $table) {
$table->increments('id');
$table->integer('driver_id')->unsigned()->index();
$table->string('driver_type');
// 或使用 $table->morphs(‘driver’) 來取代「driver_id」和「driver_type」
$table->integer('car_id')->unsigned()->index();
$table->foreign('car_id')->references('id')->on('cars')->onDelete('cascade');
});
Чтобы сохранить записи:
// 在 driver(Valet / Owner)和 Car 间建立关联
$valet->cars()->saveMany([$car1, $car2]);
$owner->cars()->saveMany([$car1, $car2]);
// 或使用 save() 方法來储存单一模型
$valet->cars()->save($car1);
$owner->cars()->save($car1);
// 在 Car 和 driver(Valet / Owner)间建立关联
$car->valets()->attach([
$valet1->id,
$valet2->id,
]);
$car->owners()->attach([
$owner1->id,
$owner2->id,
]);
// 或是用 sync() 方法來避免重复关联
$car->valets()->sync([
$valet1->id,
$valet2->id,
]);
$car->owners()->sync([
$owner1->id,
$owner2->id,
]);
Получить записи:
// 取得 driver(Valet / Owner)的 Cars
$valet->cars
$owner->cars
// 取得 Car 的 drivers(Valet 及 Owner)
$car->owners
$car->valets
Для получения более современных знаний PHP перейдите кСообщество знаний Laravel / PHP