Группировать записи по отношению

У меня есть модели, User а также Group, в many 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 какой-нибудь элегантный способ добиться этого?

1

Решение

Собственно нет, но вы можете сделать это и в лаваре.

пример:

$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;
}
0

Другие решения

Я не верю, что есть хороший способ сделать это с Eloquent, поскольку на самом деле он не учитывает эти типы сценариев, когда вы пытаетесь получить результаты от отношения, где отношения не существуют. Ты можешь использовать has() загрузить отношения с 0 результатами, но если там нет группы, с которой можно начать, это не принесет вам пользы.

Я бы предложил использовать конструктор запросов, где этот тип вещей можно сделать в одном запросе, используя левое соединение и объединение нулей, чтобы вместо этого возвращать «Негруппированный».

$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;
}
}
0

По вопросам рекламы [email protected]