Шпаргалка по ассоциации моделей Laravel Eloquent

задняя часть база данных PHP Laravel
Шпаргалка по ассоциации моделей Laravel Eloquent

file

Шпаргалка для Laravel Eloquent ORM 5.5

ассоциация один на один

Детали примера:

В этой демонстрации у нас есть 2 модели (владелец и автомобиль) и две таблицы (владельцы и автомобили).

Бизнес-логика:

Пользователь может владеть автомобилем.
У автомобиля может быть один владелец.

Диаграмма корреляции:

file

Детали ссылки:

В таблице 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 (машина), и две таблицы: воры и машины.

Бизнес правила:

Воры могут украсть более одного автомобиля. Машину может украсть только вор.

диаграмма отношений:

file

Детали отношений:

В таблице транспортных средств должен храниться идентификатор вора.

Красноречивая модель:

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;

Полиморфизм

Детали демо:

В этой демонстрации у нас есть три модели (мужчина, женщина и машина) и три таблицы (мужчина, женщина и машина).

Бизнес правила:

Человек (покупатель) может купить много автомобилей. Женщина (покупатель) может купить много автомобилей. Этот автомобиль может быть приобретен одним покупателем (мужчиной или женщиной).

диаграмма отношений:

file

Детали отношений:

В таблице 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 таблицы (камердинер, владельцы, автомобили и водители).

Бизнес-логика:

Один шофер (водитель) может управлять несколькими автомобилями
Один автовладелец (водитель) может управлять несколькими автомобилями
Автомобилем могут управлять несколько водителей (шофер и/или владелец)

Ассоциативный граф

file

Детали ссылки:

Промежуточная таблица «водители» должна хранить идентификатор водителя, тип водителя и идентификатор транспортного средства.
Вождение — это код для набора моделей (камердинер и владелец) и не ограничивается двумя моделями. Тип драйвера - настоящее название модели.

Красноречивые модели:

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

file

Для получения более современных знаний PHP перейдите кСообщество знаний Laravel / PHP