Laravel Eloquent groupBy() а также возвращает количество каждой группы
У меня есть таблица, которая содержит, среди других столбцов, столбец версий браузера. И я просто хочу знать из набора записей, сколько из каждого типа браузера есть. Итак, мне нужно закончить что-то вроде этого: Total Records: 10; Internet Explorer 8: 2; Chrome 25: 4; Firefox 20: 4. (Все складывается до 10)
вот мои два пенса:
$user_info = Usermeta::groupBy('browser')->get();
конечно, это просто содержит 3 браузера, а не количество каждого из них. Как я могу это сделать?
8 ответов:
это работает для меня:
$user_info = DB::table('usermetas') ->select('browser', DB::raw('count(*) as total')) ->groupBy('browser') ->get();
это работает для меня (Laravel 5.1):
$user_info = Usermeta::groupBy('browser')->select('browser', DB::raw('count(*) as total'))->get();
Спасибо Антонио,
Я только что добавил В конце, так что он будет возвращать только один массив с ключом и подсчитайте:
Laravel 4
$user_info = DB::table('usermetas') ->select('browser', DB::raw('count(*) as total')) ->groupBy('browser') ->lists('total','browser');
Laravel 5.1
$user_info = DB::table('usermetas') ->select('browser', DB::raw('count(*) as total')) ->groupBy('browser') ->lists('total','browser')->all();
Laravel 5.2+
$user_info = DB::table('usermetas') ->select('browser', DB::raw('count(*) as total')) ->groupBy('browser') ->pluck('total','browser')->all();
работает так же, немного более аккуратно.
getQuery()
просто возвращает базовый конструктор, который уже содержит ссылку на таблицу.$browser_total_raw = DB::raw('count(*) as total'); $user_info = Usermeta::getQuery() ->select('browser', $browser_total_raw) ->groupBy('browser') ->pluck('total','browser');
Если вы хотите получить коллекцию, groupBy и count:
$collection = ModelName::groupBy('group_id') ->selectRaw('count(*) as total, group_id') ->get();
Ура!
вот более Laravel способ обработки group by без необходимости использовать необработанные операторы.
$sources = $sources->where('age','>', 31)->groupBy('age'); $output = null; foreach($sources as $key => $source) { foreach($source as $item) { //get each item in the group } $output[$key] = $source->count(); }