使用枢纽表
如您所知,要操作多对多关联需要一个中间的数据库表。 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);
}
更多建议: