使用枢纽表

2018-02-24 15:52 更新

如您所知,要操作多对多关联需要一个中间的数据库表。 Eloquent 提供了一些有用的方法可以和这张表互动。例如,假设 User 对象关联到很多 Role 对象。取出这些关联对象时,我们可以在关联模型上取得 pivot 数据库表的数据:

$user = User::find(1);
foreach ($user->roles as $role)
{
    echo $role->pivot->created_at;
}

注意我们取出的每个 Role 模型对象会自动给一个 pivot 属性。这属性包含了枢纽表的模型数据,可以像一般的 Eloquent 模型一样使用。

默认 pivot 对象只会有关联键的属性。如果您想让 pivot 可以包含其他枢纽表的字段,可以在定义关联方法时指定那些字段:

return $this->belongsToMany('App\Role')->withPivot('foo', 'bar');

现在可以在 Role 模型的 pivot 对象上取得 foo 和 bar 属性了。

如果您想要可以自动维护枢纽表的 created_at 和 updated_at 时间戳,在定义关联方法时加上 withTimestamps 方法:

return $this->belongsToMany('App\Role')->withTimestamps();

删除枢纽表的关联数据

要删除模型在枢纽表的所有关联数据,可以使用 detach 方法:

User::find(1)->roles()->detach();

注意,如上的操作不会移除 roles 数据库表里面的数据,只会移除枢纽表里的关联数据。

更新枢纽表的数据

有时您只想更新枢纽表的数据,而没有要移除关联。如果您想更新枢纽表,可以像下面的例子使用 updateExistingPivot 方法:

User::find(1)->roles()->updateExistingPivot($roleId, $attributes);

自定义枢纽模型

Laravel 允许您自定义枢纽模型。要自定义模型,首先要建立一个继承 Eloquent 的「基本」模型类。在其他的 Eloquent 模型继承这个自定义的基本类,而不是默认的 Eloquent 。在基本模型类里,加入下面的方法返回自定义的枢纽模型实例:

public function newPivot(Model $parent, array $attributes, $table, $exists)
{
    return new YourCustomPivot($parent, $attributes, $table, $exists);
}
以上内容是否对您有帮助:
在线笔记
App下载
App下载

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号