按关系分组记录

时间:2015-01-22 22:08:53

标签: php laravel eloquent grouping

我在User相关中有模型Groupmany to many。用户可能有0个与之关联的组。我需要返回按组分组的所有用户,还有那些没有组的用户,如下所示:

所有用户的列表

  • 第1组
    • 用户1
    • 用户2
  • 第2组
    • 用户3
    • 用户4
  • 未分组
    • 用户5
    • 用户6

我尝试过使用它:

$groups = $this->group->all();

foreach($groups as $group) {
    echo $group->name;
    foreach($group->users as $user) {
        echo $user->name;
    }
}

但这仅返回属于某个组的用户。

Laravel有什么优雅的方式来实现这个目标吗?

2 个答案:

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