Laravel Eloquent groupBy () И также возвращает количество каждой группы

У меня есть таблица, которая содержит, среди других столбцов, столбец версий браузера. И я просто хочу узнать из набора рекордов, сколько существует браузеров каждого типа. Итак, мне нужно получить что-то вроде этого: Всего записей: 10; Internet Explorer 8: 2; Хром 25: 4; Firefox 20: 4 (все в сумме до 10)

Вот мои два пенса:

$user_info = Usermeta::groupBy('browser')->get();

Конечно, здесь указаны только 3 браузера, а не количество каждого из них. Как я могу это сделать?


person kJamesy    schedule 30.08.2013    source источник


Ответы (11)


Это работает для меня:

$user_info = DB::table('usermetas')
                 ->select('browser', DB::raw('count(*) as total'))
                 ->groupBy('browser')
                 ->get();
person Antonio Carlos Ribeiro    schedule 30.08.2013
comment
Превосходно! Просто добавил «браузер» к выбору таким образом: select («браузер», ...) и получил все необходимое. Ты молодец! youtube.com/watch?v=ravi4YtUTxo - person kJamesy; 30.08.2013
comment
Спасибо. Но почему это не работает при использовании с такими моделями, как User :: select ('country', DB :: raw ('count (*) as total') - ›otherMethods ()? - person doncadavona; 04.09.2015
comment
+ v. используйте \ DB вместо DB на контроллерах - person Amit Bera; 05.01.2016
comment
@AmitBera, пожалуйста, объясните причину? - person JCarlosR; 22.07.2016
comment
@JCarlos Поздно я знаю. Но \ DB необходим, потому что в текущих версиях Laravel контроллер будет иметь пространство имен. \ DB означает, что ваш код будет искать класс DB в корневом каталоге, а не в пространстве имен контроллеров. - person Ryk Waters; 13.10.2016
comment
Есть ли какая-то особая причина, по которой вы предпочитаете DB::table('usermetas')->.. Usermeta::..? - person Adam; 16.10.2017
comment
Привет, @Antonio, у меня возникла ошибка при вызове функции-члена groupBy () в массиве. Мой laravel-запрос: $ members = DB :: select ('select * from sizes') - ›groupBy ('sizes.patient_id') -› get (); Как я могу заставить это работать? Спасибо - person drakogemini2; 04.11.2019
comment
Я знаю, что это старый пост, однако мне было интересно, может ли кто-нибудь просто выяснить, как получить результаты «общих записей», как указано в вопросе. - person Brayam Valero; 15.04.2021

Это работает для меня (Laravel 5.1):

$user_info = Usermeta::groupBy('browser')->select('browser', DB::raw('count(*) as total'))->get();
person carlituxman    schedule 20.07.2016

Спасибо Антонио,

Я только что добавил команду lists в конце, поэтому она вернет только один массив с ключом и счетчиком:

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();
person Diogo Gomes    schedule 11.08.2015
comment
Спасибо. Одно замечание: - ›all () в примере 5.1 следует удалить, так как вы уже перечислили результаты. - person Pim; 27.02.2017
comment
list() устарел и переименован в pluck() laravel.com/docs/5.2/upgrade#upgrade -5.2.0 - person Arun Code; 25.11.2017
comment
как отсортировать по сумме после ощипывания и взять 10 высоких отсчетов из этого - person Hossein Azad; 17.04.2021
comment
я основал tnx usermetas :: groupBy ('browser') - ›selectRaw ('count (*) as total, browser') -› orderBy ('total', 'DESC') - ›skip (0) -› take ($ число) - ›pluck ('браузер'); - person Hossein Azad; 17.04.2021

Если вы хотите получить коллекцию, groupBy и count:

$collection = ModelName::groupBy('group_id')
->selectRaw('count(*) as total, group_id')
->get();

Ваше здоровье!

person Adam Kozlowski    schedule 17.08.2018

Работает и так, немного аккуратнее. getQuery() просто возвращает базовый построитель, который уже содержит ссылку на таблицу.

$browser_total_raw = DB::raw('count(*) as total');
$user_info = Usermeta::getQuery()
                     ->select('browser', $browser_total_raw)
                     ->groupBy('browser')
                     ->pluck('total','browser');
person Yauheni Prakopchyk    schedule 12.11.2015

  1. Открыть config/database.php
  2. Найдите ключ strict в настройках подключения mysql.
  3. Установите значение false.
person Boris Tetřev    schedule 27.08.2018
comment
идеальный способ избежать сырого запроса !! - person Ranjan Fadia; 07.01.2021

Попробуйте с этим

->groupBy('state_id','locality')
  ->havingRaw('count > 1 ')
  ->having('items.name','LIKE',"%$keyword%")
  ->orHavingRaw('brand LIKE ?',array("%$keyword%"))
person Jasim Juwel    schedule 07.12.2017
comment
Хотя это может дать ответ на вопрос, лучше объяснить основные части ответа и, возможно, в чем заключалась проблема с кодом OP. - person pirho; 07.12.2017
comment
Спасибо! Бит havingRaw действительно хорош, поскольку он позволяет вам также фильтровать результаты, которые вам не нужны, на основе подсчета. Пригодится, когда вы хотите выполнить фильтрацию и и объединить каждый фильтр. - person Arno van Oordt; 19.11.2020

Вот еще один способ Laravel для обработки группы без необходимости использовать необработанные операторы.

$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();
}
person Vulfoliac    schedule 28.03.2018
comment
Это требует памяти и обработки. - person doncadavona; 04.06.2018
comment
Та же память pb для меня - person Vince; 15.06.2020

$post = Post::select(DB::raw('count(*) as user_count, category_id'))
              ->groupBy('category_id')
              ->get();

Это пример результатов подсчета сообщений по категориям.

person Yuvraj Hinger    schedule 15.06.2020

Если вы хотите получить отсортированные данные, используйте это также

$category_id = Post::orderBy('count', 'desc')
                     ->select(DB::raw('category_id,count(*) as count'))
                     ->groupBy('category_id')
                     ->get();
person Yuvraj Hinger    schedule 15.06.2020

Laravel версии 8

Убрана зависимость БД

     $counts = Model::whereIn('agent_id', $agents)
        ->orderBy('total', 'asc')
        ->selectRaw('agent_id, count(*) as total')
        ->groupBy('agent_id')
        ->pluck('total','agent_id')->all();
person Alaksandar Jesus Gene    schedule 26.05.2021