使用枢纽表

最后更新于:2022-04-01 15:12:09

如您所知,要操作多对多关联需要一个中间的数据库表。 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); } ~~~
';