使用belongsToMany()加入另一个表?

时间:2014-08-17 06:58:43

标签: laravel-4 many-to-many

这个问题最好通过一个例子说明:

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_usergroup_user个中间表,但没有。什么是正确的方法?

PS:我知道最好将排名和组分成他们自己的关系/数据透视表,这只是一个例子。

编辑:最近的例子我可以找到:https://github.com/laravel/framework/issues/2619#issuecomment-38015154

1 个答案:

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

如上所述的关系查询在过于复杂时不太直观,因此重新考虑数据库设计可能会更好,但理论上可以操纵它们。