如何选择显式表(包含迁移和模型)作为数据透视表?
我的模特
User
-id
Role
-id
user_role
-user_id
-role_id
-other_foreign_key_id
-other_attributes
-...
我知道在一般情况下,多少对多的关系在laravel中起作用。但是在文档中,他们只使用自动生成的连接表,我无法为其他列定义额外的外键约束或数据类型。
我想要的是我有自己的user_role表的迁移和模型,并将其用作枢轴,但我不知道如何将定义的表显式链接为一个m到n的关系。
提前致谢。
答案 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抓住这个数据透视模型,我们还需要覆盖newPivot
和User
上的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);
}
希望这有帮助!