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

70

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

Здесь мои два пенса:

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

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

Теги:
eloquent
laravel-4

8 ответов

127
Лучший ответ

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

$user_info = DB::table('usermetas')
                 ->select('browser', DB::raw('count(*) as total'))
                 ->groupBy('browser')
                 ->get();
  • 1
    Superb! Просто добавил «браузер» к выбору таким образом: выберите («браузер», ...) и получил все необходимое. Ты хороший, ты! youtube.com/watch?v=ravi4YtUTxo
  • 0
    Благодарю. Но почему он не работает при использовании с такими моделями, как User :: select ('country', DB :: raw ('count (*) as total') -> otherMethods ()?
Показать ещё 4 комментария
22

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

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

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

Я только что добавил команду 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();
  • 0
    Благодарю. Одно примечание: -> all () в примере 5.1 следует удалить, так как вы уже перечислили результаты.
  • 1
    list() устарел и переименован в pluck pluck() laravel.com/docs/5.2/upgrade#upgrade-5.2.0
8

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

$browser_total_raw = DB::raw('count(*) as total');
$user_info = Usermeta::getQuery()
                     ->select('browser', $browser_total_raw)
                     ->groupBy('browser')
                     ->pluck('total','browser');
2
  1. Откройте config/database.php
  2. Найти strict ключ в настройках подключения mysql
  3. Установите значение в false
2

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

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

Ура!

1

Вот более простой способ обработки группы 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();
}
  • 3
    Это память и обработка голодны.
0

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

->groupBy('state_id','locality')
  ->havingRaw('count > 1 ')
  ->having('items.name','LIKE',"%$keyword%")
  ->orHavingRaw('brand LIKE ?',array("%$keyword%"))
  • 2
    Хотя это может дать ответ на вопрос, лучше объяснить основные части ответа и, возможно, в чем была проблема с кодом OP.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню