У меня есть таблица, которая содержит среди других столбцов столбец версий браузера. И я просто хочу узнать из набора записей, сколько у каждого типа браузера есть. Итак, мне нужно в итоге что-то вроде этого: Total Records: 10; Internet Explorer 8: 2; Хром 25: 4; Firefox 20: 4. (Все с добавлением до 10)
Здесь мои два пенса:
$user_info = Usermeta::groupBy('browser')->get();
Конечно, это всего лишь три браузера, а не количество каждого. Как я могу это сделать?
Это работает для меня:
$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();
Спасибо Антонио,
Я только что добавил команду 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();
list()
устарел и переименован в pluck pluck()
laravel.com/docs/5.2/upgrade#upgrade-5.2.0
Работает так же, немного более аккуратно.
getQuery()
просто возвращает базовый конструктор, который уже содержит ссылку на таблицу.
$browser_total_raw = DB::raw('count(*) as total');
$user_info = Usermeta::getQuery()
->select('browser', $browser_total_raw)
->groupBy('browser')
->pluck('total','browser');
config/database.php
strict
ключ в настройках подключения mysql
false
Если вы хотите получить коллекцию, groupBy и count:
$collection = ModelName::groupBy('group_id')
->selectRaw('count(*) as total, group_id')
->get();
Ура!
Вот более простой способ обработки группы 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();
}
->groupBy('state_id','locality')
->havingRaw('count > 1 ')
->having('items.name','LIKE',"%$keyword%")
->orHavingRaw('brand LIKE ?',array("%$keyword%"))