У меня есть модели, 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 какой-нибудь элегантный способ добиться этого?
Собственно нет, но вы можете сделать это и в лаваре.
пример:
$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;
}
Я не верю, что есть хороший способ сделать это с 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;
}
}