2014-10-03 59 views
3

我有3个表格;用户,组和权限雄辩多对多 - 如何轻松加载远处的关系

在模型中我有关系,因为belongsToMany 在用户模式设置:

public function groups() { 
    return $this->belongsToMany('Group'); 
} 

在组模型:

public function users() { 
    return $this->belongsToMany('User'); 
} 

public function permissions() { 
    return $this->belongsToMany('Permission'); 
} 

在权限模型:

public function groups() { 
    return $this->belongsToMany('Group', 'id'); 
} 

许多用户对多组 m任何组对多的权限

我试图获得用户拥有的所有权限,并且不知道它的代码应该是什么样子。谁能帮忙?

回答

13

这是你如何做到这一点:

User::where('id', $id)->with(['groups.permissions' => function ($q) use (&$permissions) { 
    $permissions = $q->get()->unique(); 
}])->first(); 

// then 
$permissions; // collection of unique permissions of the user with id = $id 
+0

仍然不知道如何,但它确实有效。需要深入阅读文档。 – 2014-10-03 22:45:13

+1

超级聪明我的朋友 – lagbox 2014-10-06 05:27:28

+0

@PawelBieszczad你不会在文档中找到它。这只是获得你所需要的一个技巧。缺点是它会运行1个额外的查询来获取它,但是它比在相关集合中循环更容易,并且即使对于更深层的嵌套关系也是如此。 – 2014-10-06 05:54:20

0

它应该是这个样子,如果你渴望载入中...

$user = User::where('id', $id)->with(['groups.permissions'])->first(); 
+0

以及如何将我得到的权限? $ q = User :: where('id',$ id) - > with(['groups.permissions']) - > first(); dd($ q-> permission); 没有显示任何东西 – 2014-10-03 21:34:34

+0

'$ q-> groups [$ index] - > permissions' – Rob 2014-10-03 21:38:29

+0

我试图避免循环,就像查询获得数组或集合中的所有权限 – 2014-10-03 21:42:24