Laravel Eloquent 模型关联ORM速查表

2019-01-1411:59:57后端程序开发Comments2,261 views字数 5731阅读模式
Laravel Eloquent 模型关联ORM速查表

一張 Laravel’s Eloquent ORM 5.5 的速查表文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/9346.html

一对一关联

示例细节:

在这个展示中,我们有 2 个模型(Owner 和 Car)及两张表(owners 和 cars)。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/9346.html

业务逻辑:

一个使用者可以拥有一台车。
一台车可以有一个拥有者。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/9346.html

关联图:

Laravel Eloquent 模型关联ORM速查表

关联细节:

Cars 表必须存储 Owner ID。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/9346.html

Eloquent 模型:

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 (车),和两张表: thieves 和 cars 。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/9346.html

业务规则:

小偷可以偷走多辆车。 车只能被一个小偷偷走。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/9346.html

关系图:

Laravel Eloquent 模型关联ORM速查表

关系细节:

车辆表应该存储小偷的 ID 。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/9346.html

Eloquent 模型:

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;
复制代码

多态一对多关系

演示细节:

在这个演示中,我们有三个模型(Man, Woman 和 Car),和三张表(man, women 和 cars)。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/9346.html

业务规则:

一个男人(买家)可以买很多汽车。 一个女人(买家)可以买很多汽车。 这个汽车可以被一个买家购买(男人或女人)。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/9346.html

关系图:

Laravel Eloquent 模型关联ORM速查表

关系详情:

Car表应该储存买家 ID 和买家类型。 "buyer" 是一组模型名称 (男人 和 女人), 它不仅限于两者,buyer 类型是模型的真实名称 。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/9346.html

Eloquent 模型:

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
复制代码

多对多关联

示例展示:

在这个示例中,我们有两个模型(Driver 和 Car),和三张表 (drivers,名为 car_driver的中间关联表).文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/9346.html

业务规则:

一个司机可以驾驶很多辆车。 一辆车可以被很多个司机开。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/9346.html

关系图:

Laravel Eloquent 模型关联ORM速查表

关联详情:

关联表"car_driver"应该保存驾驶员ID和汽车ID。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/9346.html

关联模型:

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
复制代码

多对多多态关联

展示细节:

在这个展示中我们有三个模型(Valet、Owner 及 Car)和 4 张表(valets、owners、cars 及 drivers)。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/9346.html

业务逻辑:

一个代驾(司机)可以驾驶很多辆车
一个车主(司机)可以驾驶很多辆车
一台车可以被很多个司机驾驶(代驾和 / 或车主)文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/9346.html

关联图

Laravel Eloquent 模型关联ORM速查表

关联细节:

中间表「drivers」应该储存驾驶人 ID、驾驶人类型及车辆 ID。
驾驶是一個模型集合的代码(Valet 及 Owner),而且不限定兩个模型。驾驶人类型是模型的真正名称。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/9346.html

Eloquent 模型:

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
复制代码

Laravel Eloquent 模型关联ORM速查表
文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/9346.html
  • 本站内容整理自互联网,仅提供信息存储空间服务,以方便学习之用。如对文章、图片、字体等版权有疑问,请在下方留言,管理员看到后,将第一时间进行处理。
  • 转载请务必保留本文链接:https://www.cainiaoxueyuan.com/bc/9346.html

Comment

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定