Агрегатная функция Laravel в одном запросе

У меня есть модель пользователя с таблицей пользователей (идентификатор, электронная почта, пароль, пол, статус)

Я хочу перечислить пользователей на основе состояния вместе с подсчетом пола, вот мой код:

$users = App\User::where('status', '1');
$users = $users->orderBy('email');

$data['all_users'] = $users; // all users
$data['total_males'] = $users->where('gender', 'M')->count(); // male count
$data['total_females'] = $users->where('gender', 'F')->count(); // female count

return view('users.list', $data);

Приведенный выше код не возвращает всех пользователей в представлении и фильтрует пол, даже если я уже передал объект результата $users в массив $data.

Конечно, я могу установить переменные male_count и female_count в представлении и увеличить их на основе таких условий, как if (gender == 'M') total_males++, и отобразить вне цикла.

Что я здесь делаю неправильно?


person Dipendra Gurung    schedule 28.08.2017    source источник
comment
Можете ли вы добавить ошибку или более подробное описание, трудно понять проблему   -  person Sagar Gautam    schedule 28.08.2017
comment
вам нужно добавить ->get() к $users, чтобы получить данные, вы просто добавляете $users ко всем пользователям   -  person Sagar Gautam    schedule 28.08.2017


Ответы (4)


Правильный способ выполнения ваших красноречивых запросов на вашем контроллере и передачи данных в представление:

$users = App\User::where('status', '1')->orderBy('email')->get();

$data['all_users'] = $users; // all users
$data['total_males'] = App\User::where('gender', 'M')->count(); // male count
$data['total_females'] = App\User::where('gender', 'F')->count(); // female count

return view('users.list', $data);
person Troyer    schedule 28.08.2017
comment
Серьезно, ->get() не требуется, я думаю, что count должен работать. - person Sagar Gautam; 28.08.2017
comment
Да, основываясь на документе Laravel, не нужно добавлять get. laravel.com/docs/4.2/queries#aggregates - person Benjamin Brasseur; 28.08.2017

Простая вещь, которую я забыл! У меня есть привычка помещать функцию get() в представление: :p

$data['all_users'] = $users->get(); // all users
$data['total_males'] = $users->where('gender', 'M')->count(); // male count
$data['total_females'] = $users->where('gender', 'F')->count(); // female count
person Dipendra Gurung    schedule 28.08.2017
comment
что вы подразумеваете под в представлении? - person Benjamin Brasseur; 28.08.2017
comment
@BenjaminBrasseur в виде лезвия. ;) - person Dipendra Gurung; 28.08.2017
comment
Ох, хорошо. Немного странно вызывать запрос в представлении, а не в контроллере ^^ Итак, знаете, все работает, если вы выполняете get on $users ? - person Benjamin Brasseur; 28.08.2017
comment
Не выполняйте красноречивые запросы и не изменяйте данные в представлении, делайте это на контроллере. Пожалуйста :'( - person Troyer; 28.08.2017

Вы не вызвали метод get. Пожалуйста, попробуй

$data['all_users'] = $users->get(); // all users
person Mahbub    schedule 28.08.2017

Eloquent не выполнился, потому что там нет метода получения или подсчета
$data['all_users'] = $users->count(); // все пользователи

person Yusuf Eka Sayogana    schedule 28.08.2017
comment
Пожалуйста, объясните немного больше вашего ответа. Не просто давайте код, не объясняя, почему. - person Benjamin Brasseur; 28.08.2017
comment
просто объясните, что вы хотите сказать. - person Kuldeep Mishra; 28.08.2017