Laravel Eloquent多对多关系:使用显式数据透视表

时间:2016-12-19 14:21:44

标签: laravel eloquent many-to-many

如何选择显式表(包含迁移和模型)作为数据透视表?

我的模特

User
-id

Role
-id

user_role
-user_id
-role_id
-other_foreign_key_id
-other_attributes
-...

我知道在一般情况下,多少对多的关系在laravel中起作用。但是在文档中,他们只使用自动生成的连接表,我无法为其他列定义额外的外键约束或数据类型。

我想要的是我有自己的user_role表的迁移和模型,并将其用作枢轴,但我不知道如何将定义的表显式链接为一个m到n的关系。

提前致谢。

1 个答案:

答案 0 :(得分:1)

除了自定义连接表的名称之外,您还可以通过将其他参数传递给belongsToMany方法来自定义表上键的列名。第三个参数是foreign key name of the model on which you are defining the relationship,而第四个参数是foreign key name of the model that you are joining to,如下所示:

return $this->belongsToMany('App\Role', 'role_user', 'user_id', 'role_id')
           ->withPivot(['other_foreign_key_id', 'other_attributes']);
  

默认情况下,只有模型键才会出现在数据透视对象上。如果数据透视表包含额外属性,则必须在使用withPivot()方法定义关系时指定它们,如上所述:

您可以像pivot attributes这样使用pivot

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

UPDATE - Eloquent中的自定义透视模型

您还可以像这样定义自己的自定义枢轴模型:

class RoleUserPivot extends Pivot {
    // let's use date mutator for a field
    protected $dates = ['completed_at'];
}

现在,为了让Eloquent抓住这个数据透视模型,我们还需要覆盖newPivotUser上的Role方法:

// User model
public function newPivot(Model $parent, array $attributes, $table, $exists)
{
    if ($parent instanceof Role) {
        return new RoleUserPivot($parent, $attributes, $table, $exists);
    }

    return parent::newPivot($parent, $attributes, $table, $exists);
}


// Role model
public function newPivot(Model $parent, array $attributes, $table, $exists)
{
    if ($parent instanceof User) {
        return new RoleUserPivot($parent, $attributes, $table, $exists);
    }

    return parent::newPivot($parent, $attributes, $table, $exists);
}
  

详细了解Custom Pivot Tables

希望这有帮助!