Метод groupBy
Метод groupBy применяется к запросу Eloquent
или Query Builder для группировки строк результата
на основе значений одной или нескольких колонок.
Он принимает имя колонки или массив колонок для группировки.
Обычно используется в сочетании с агрегатными функциями.
Синтаксис
<?php
Model::groupBy($column);
?>
Пример
Сгруппируем статьи по статусу и подсчитаем их количество:
<?php
use AppModelsArticle;
use IlluminateSupportFacadesDB;
$res = Article::select('status', DB::raw('count(*) as total'))
->groupBy('status')
->get();
foreach ($res as $item) {
echo "Status: $item->status, Total: $item->total";
}
?>
Результат выполнения кода:
"Status: published, Total: 5"
"Status: draft, Total: 3"
"Status: archived, Total: 2"
Пример
Сгруппируем по нескольким колонкам и подсчитаем количество:
<?php
use AppModelsArticle;
use IlluminateSupportFacadesDB;
$res = Article::select('status', 'category_id', DB::raw('count(*) as total'))
->groupBy(['status', 'category_id'])
->get();
foreach ($res as $item) {
echo "Status: $item->status, Category: $item->category_id, Total: $item->total";
}
?>
Результат выполнения кода:
"Status: published, Category: 1, Total: 3"
"Status: published, Category: 2, Total: 2"
"Status: draft, Category: 1, Total: 1"
"Status: draft, Category: 3, Total: 2"
Пример
Используем группировку с вычислением средней оценки:
<?php
use AppModelsArticle;
use IlluminateSupportFacadesDB;
$res = Article::select('status', DB::raw('AVG(rating) as avg_rating'))
->groupBy('status')
->get();
foreach ($res as $item) {
echo "Status: $item->status, Average rating: $item->avg_rating";
}
?>
Результат выполнения кода:
"Status: published, Average rating: 4.5"
"Status: draft, Average rating: 3.2"
"Status: archived, Average rating: 2.8"
Пример
Группировка с использованием агрегатных функций и сортировки:
<?php
use AppModelsArticle;
use IlluminateSupportFacadesDB;
$res = Article::select('category_id', DB::raw('count(*) as total'))
->groupBy('category_id')
->orderBy('total', 'desc')
->get();
foreach ($res as $item) {
echo "Category: $item->category_id, Total articles: $item->total";
}
?>
Результат выполнения кода:
"Category: 1, Total articles: 8"
"Category: 2, Total articles: 5"
"Category: 3, Total articles: 3"