我有3张桌子:users
,pools
,permissions
。用户和池具有数据透视表,因为它们具有多对多关系。
权限条目由我手动创建。然后,每个池可以根据自己的需要为自己的用户分配权限。因此,用于将用户链接到权限的数据透视表需要包含pool_id
和user_id
以及permission_id
那么这个数据透视表是如何工作的?如何制作三向数据透视表?
编辑:我的问题基本上是asked here,没有令人满意的答案!
答案 0 :(得分:1)
对于链接3个模型的数据透视表,在附加模型时需要额外的数据发送,例如:Laravel - Pivot table for three models - how to insert related models?:
$model->relation()->attach($otherModel, ['thirdModelKeyName' => 'thirdModelKeyValue']);
您可以创建自定义关系类,例如ThreeBelongsToMany
,它将扩展belongsToMany
并覆盖attach()
方法。
然后在您的模型上覆盖belongsToMany()
方法,这些方法涉及这种关系(或在那里使用特征),以在适用时返回提到的自定义关系类而不是通用belongsToMany
。
attach()
方法可能如下所示:
public function attach($id, array $attributes = array(), $touch = true, $otherId = null)
{
if ( ! is_null($otherId))
{
if ($otherId instanceof Model) $otherId = $otherId->getKey();
$attributes[$this->getThirdKey()] = $otherId;
}
return parent::attach($id, $attributes, $touch);
}
此外,你可以使用一些助手来获取那些相关的模型,例如(键名应该通过灵活的方法获得,它们是硬编码的,以便缩短):
/**
* Accessor for far related model (thru pivot)
*
* @return mixed
*/
public function getTrackAttribute()
{
if (is_null($this->pivot)) return null;
if (is_null($this->pivot->track_id)) return null;
return ($this->pivot->track) ?: $this->pivot->track = Track::find($this->pivot->track_id);
}