Laravel - 表与另外两个表之间的关系

时间:2014-05-15 06:49:17

标签: laravel migration pivot

我有3张桌子:userspoolspermissions。用户和池具有数据透视表,因为它们具有多对多关系。

权限条目由我手动创建。然后,每个池可以根据自己的需要为自己的用户分配权限。因此,用于将用户链接到权限的数据透视表需要包含pool_iduser_id以及permission_id

那么这个数据透视表是如何工作的?如何制作三向数据透视表?

编辑:我的问题基本上是asked here,没有令人满意的答案!

1 个答案:

答案 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);
}