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


112

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

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

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

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

Ответы:


219

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

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

1
Превосходно! Просто добавил «браузер» к выбору таким образом: select («browser», ...) и получил все необходимое. Ты молодец! youtube.com/watch?v=ravi4YtUTxo
kJamesy

Спасибо. Но почему это не работает при использовании с такими моделями, как User :: select ('country', DB :: raw ('count (*) as total') -> otherMethods ()?
doncadavona

1
+ v. используйте \ DB вместо DB на контроллерах
Амит Бера

@AmitBera, вы можете объяснить причину ?, пожалуйста
JCarlosR

8
Есть ли какая-то конкретная причина, по которой вы предпочитаете DB::table('usermetas')->..больше Usermeta::..?
Адам

34

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

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

22

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

Я только что добавил 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();

1
Спасибо. Одно замечание: -> all () в примере 5.1 следует удалить, так как вы уже перечислили результаты.
Пим

1
list()устарела и переименована в pluck() laravel.com/docs/5.2/upgrade#upgrade-5.2.0
Arun Code

13

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

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

Ура!


9

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

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

5
  1. открыто config/database.php
  2. Найдите strictключ в mysqlнастройках подключения
  3. Установите значение на false

1

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

->groupBy('state_id','locality')
  ->havingRaw('count > 1 ')
  ->having('items.name','LIKE',"%$keyword%")
  ->orHavingRaw('brand LIKE ?',array("%$keyword%"))

2
Хотя это может дать ответ на вопрос, лучше объяснить основные части ответа и, возможно, в чем была проблема с кодом OP.
pirho 07

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();
}

8
Это требует памяти и обработки.
doncadavona

То же воспоминание, п.б. для меня
Винс

0

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

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

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.