我在User
相关中有模型Group
和many to many
。用户可能有0个与之关联的组。我需要返回按组分组的所有用户,还有那些没有组的用户,如下所示:
我尝试过使用它:
$groups = $this->group->all();
foreach($groups as $group) {
echo $group->name;
foreach($group->users as $user) {
echo $user->name;
}
}
但这仅返回属于某个组的用户。
Laravel有什么优雅的方式来实现这个目标吗?
答案 0 :(得分:0)
原封不,但你也可以用laravel的方式来做。
示例:
$groups = Groups::with('users')->all();
foreach($groups as $group){
echo $group->name;
foreach($group->users as $user){
echo $user->name;
}
}
$usersWithoutGroups = User::has('groups', '<', 1)->get();
echo 'Without Groups';
foreach($group->users as $user){
echo $user->name;
}
答案 1 :(得分:0)
我不相信有一个很好的方法可以用Eloquent做到这一点,因为它并没有真正解释这些类型的场景,你试图从不存在关系的关系中获得结果。您可以使用has()
来加载0结果的关系,但如果没有组可以开始,那么它对您没有多大帮助。
我建议使用查询构建器,在单个查询中可以使用左连接完成此类事件,并在空值上合并以返回'Ungrouped'。
$results = DB::table('users')
->selectRaw('group_concat(users.name) as user_list, coalesce(groups.name, \'Ungrouped\') as group_name')
->leftJoin('group_user', 'group_user.user_id', '=', 'users.id')
->leftJoin('groups', 'groups.id', '=', 'group_user.group_id')
->groupBy('groups.name')
->get();
foreach($results as $result) {
echo $result->group_name;
$users = explode(',', $result->group_name);
foreach($users as $user) {
echo $user;
}
}