Метод having
Метод having применяется к запросу Query Builder
и используется для фильтрации группированных записей.
Он работает аналогично методу where, но применяется
после группировки данных с помощью groupBy.
Первым параметром передаётся имя колонки, вторым - оператор
сравнения, третьим - значение. Если оператор не указан,
используется равенство.
Синтаксис
<?php
DB::table($table)
->groupBy($column)
->having($column, $operator, $value)
->get();
?>
Пример
Давайте сгруппируем статьи по пользователям и оставим только тех,
у кого количество статей больше 5:
<?php
namespace AppHttpControllers;
use Illuminate\Support\Facades\DB;
class ArticleController extends Controller
{
public function index()
{
$res = DB::table('articles')
->select('user_id', DB::raw('count(*) as total'))
->groupBy('user_id')
->having('total', '>', 5)
->get();
echo json_encode($res);
}
}
?>
Результат выполнения кода:
[{"user_id":3,"total":7},{"user_id":8,"total":6}]
Пример
Давайте найдём категории со средней стоимостью товаров
больше 500:
<?php
namespace AppHttpControllers;
use Illuminate\Support\Facades\DB;
class ProductController extends Controller
{
public function index()
{
$res = DB::table('products')
->select('category', DB::raw('avg(price) as avg_price'))
->groupBy('category')
->having('avg_price', '>', 500)
->get();
echo json_encode($res);
}
}
?>
Результат выполнения кода:
[{"category":"electronics","avg_price":750.5},{"category":"furniture","avg_price":620.25}]
Пример с несколькими условиями
Метод having можно использовать несколько раз
для добавления дополнительных условий:
<?php
namespace AppHttpControllers;
use Illuminate\Support\Facades\DB;
class OrderController extends Controller
{
public function index()
{
$res = DB::table('orders')
->select('customer_id', DB::raw('count(*) as orders_count'), DB::raw('sum(total) as total_sum'))
->groupBy('customer_id')
->having('orders_count', '>', 10)
->having('total_sum', '>', 5000)
->get();
echo json_encode($res);
}
}
?>
Результат выполнения кода:
[{"customer_id":5,"orders_count":12,"total_sum":6800.5}]