雄辩的多对多对多 - 如何轻松加载远距离关系
Posted
技术标签:
【中文标题】雄辩的多对多对多 - 如何轻松加载远距离关系【英文标题】:Eloquent many-to-many-to-many - how to load distant relation easily 【发布时间】:2014-11-28 23:45:27 【问题描述】:我有 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');
许多用户 - 到 - 许多组 多组对多权限
我正在尝试获取用户拥有的所有权限,但不知道它的代码应该是什么样子。有人可以帮忙吗?
【问题讨论】:
【参考方案1】:你可以这样做:
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
【讨论】:
仍然不知道如何,但它确实有效。需要深入阅读文档。 超级聪明的朋友 @PawelBieszczad 你不会在文档中找到它。这只是获得所需内容的技巧。缺点是它将运行 1 个额外的查询来获取它,但它比循环遍历相关集合要容易得多,它甚至适用于更深的嵌套关系。 我有一个类似的问题,但我有点卡住了,你能帮我一下吗,Jarek? ***.com/questions/29662699/laravel-eloquent-nesting @dbr 这应该是softonsofa.com/…【参考方案2】:如果您急于加载,它应该看起来像这样......
$user = User::where('id', $id)->with(['groups.permissions'])->first();
【讨论】:
我将如何获得权限? $q = User::where('id', $id)->with(['groups.permissions'])->first(); dd($q->权限);没有显示任何东西$q->groups[$index]->permissions
我试图避免循环,例如获取数组或集合中所有权限的查询以上是关于雄辩的多对多对多 - 如何轻松加载远距离关系的主要内容,如果未能解决你的问题,请参考以下文章