Метод havingRaw
Метод havingRaw применяется к запросу Query Builder и позволяет добавить сырое условие в секцию HAVING запроса. Это бывает полезно, когда стандартных методов having недостаточно для построения сложных условий агрегации. В качестве параметра метод принимает строку с SQL-выражением и массив привязок для безопасной подстановки значений.
Синтаксис
<?php
DB::table($table)->havingRaw($sql, $bindings = []);
?>
Пример
Давайте найдём категории, у которых средняя цена товаров больше 100:
<?php
use Illuminate\Support\Facades\DB;
$res = DB::table('products')
->select('category_id', DB::raw('AVG(price) as avg_price'))
->groupBy('category_id')
->havingRaw('AVG(price) > ?', [100])
->get();
foreach ($res as $row) {
echo $row->category_id . ' - ' . $row->avg_price;
}
?>
Результат выполнения кода:
"1 - 150.5"
"3 - 200.75"
Пример
Теперь найдём категории, у которых количество товаров больше 5 и средняя цена меньше 500:
<?php
use Illuminate\Support\Facades\DB;
$res = DB::table('products')
->select('category_id', DB::raw('COUNT(*) as count'), DB::raw('AVG(price) as avg_price'))
->groupBy('category_id')
->havingRaw('COUNT(*) > ? AND AVG(price) < ?', [5, 500])
->get();
foreach ($res as $row) {
echo $row->category_id . ' - count: ' . $row->count . ', avg: ' . $row->avg_price;
}
?>
Результат выполнения кода:
"2 - count: 7, avg: 250.3"
"4 - count: 6, avg: 320.8"
Пример
Используем именованные привязки для более сложного условия:
<?php
use Illuminate\Support\Facades\DB;
$minPrice = 100;
$maxPrice = 500;
$res = DB::table('products')
->select('category_id', DB::raw('MIN(price) as min_price'), DB::raw('MAX(price) as max_price'))
->groupBy('category_id')
->havingRaw('MIN(price) >= :min AND MAX(price) <= :max', [
'min' => $minPrice,
'max' => $maxPrice
])
->get();
foreach ($res as $row) {
echo $row->category_id . ' - min: ' . $row->min_price . ', max: ' . $row->max_price;
}
?>
Результат выполнения кода:
"1 - min: 120, max: 450"
"3 - min: 150, max: 480"