这个问题最好通过一个例子说明:
users
id
name
roles
id
name
role_user
user_id
role_id
rank_id
group_id
...
ranks
id
name
groups
id
name
我可以通过在User.php
模型中指定以下关系来轻松加载用户表:
public function roles() {
return $this->belongsToMany('Role');
}
调用User::with('roles')
时会输出下表:
User | Role
-------------
Jon | Admin
Jan | Mod
但是我不知道如何扩展它包括:
User | Role | Rank | Group
-----------------------------
Jon | Admin | Boss | Blue
Jan | Mod | Minion | Red
我尝试过做User::with('roles', 'ranks', 'groups')
,但这肯定是错的,因为我告诉Laravel有rank_user
和group_user
个中间表,但没有。什么是正确的方法?
PS:我知道最好将排名和组分成他们自己的关系/数据透视表,这只是一个例子。
编辑:最近的例子我可以找到:https://github.com/laravel/framework/issues/2619#issuecomment-38015154
答案 0 :(得分:3)
您可以将模型的关系方法视为普通查询,并以它们为基础:
public function roles() {
return $this->belongsToMany('Role')
->join('role_user', 'role_user.role_id', '=', 'roles.id')
->join('ranks', 'ranks.id', '=', 'role_user.rank_id')
->join('groups', 'groups.id', '=', 'role_user.group_id');
}
如上所述的关系查询在过于复杂时不太直观,因此重新考虑数据库设计可能会更好,但理论上可以操纵它们。