Метод selectRaw
Метод selectRaw применяется к запросу Query Builder
и позволяет внедрить произвольное SQL-выражение в секцию
SELECT. Первым параметром передаётся строка с SQL-выражением,
вторым - необязательный массив привязок для защиты от
SQL-инъекций. Метод возвращает тот же экземпляр запроса,
дополненный указанным выражением.
Синтаксис
<?php
DB::table($table)->selectRaw($expression, $bindings);
?>
Пример
Давайте выберем статьи с вычисляемым полем, которое объединяет заголовок и количество просмотров:
<?php
namespace AppHttpControllers;
use IlluminateSupportFacadesDB;
class ArticleController extends Controller
{
public function index()
{
$res = DB::table('articles')
->selectRaw('title, CONCAT(title, " - ", views) as full_info')
->get();
return $res;
}
}
?>
Результат выполнения кода:
[
{"title": "article 1", "full_info": "article 1 - 100"},
{"title": "article 2", "full_info": "article 2 - 200"},
{"title": "article 3", "full_info": "article 3 - 150"}
]
Пример
Используем агрегатную функцию для подсчёта общего количества комментариев к статье:
<?php
namespace AppHttpControllers;
use IlluminateSupportFacadesDB;
class ArticleController extends Controller
{
public function index()
{
$res = DB::table('articles')
->selectRaw('id, title, (SELECT COUNT(*) FROM comments WHERE comments.article_id = articles.id) as comments_count')
->get();
return $res;
}
}
?>
Результат выполнения кода:
[
{"id": 1, "title": "article 1", "comments_count": 5},
{"id": 2, "title": "article 2", "comments_count": 3},
{"id": 3, "title": "article 3", "comments_count": 7}
]
Пример
Выполним математические вычисления прямо в запросе, используя привязки для безопасной подстановки значений:
<?php
namespace AppHttpControllers;
use IlluminateSupportFacadesDB;
class ArticleController extends Controller
{
public function index()
{
$discount = 10;
$res = DB::table('products')
->selectRaw('name, price, price - ? as discounted_price', [$discount])
->get();
return $res;
}
}
?>
Результат выполнения кода:
[
{"name": "product 1", "price": 100, "discounted_price": 90},
{"name": "product 2", "price": 200, "discounted_price": 190},
{"name": "product 3", "price": 150, "discounted_price": 140}
]
Пример
Комбинируем несколько сырых выражений в одном запросе и используем функции работы с датами:
<?php
namespace AppHttpControllers;
use IlluminateSupportFacadesDB;
class ArticleController extends Controller
{
public function index()
{
$res = DB::table('orders')
->selectRaw('
id,
YEAR(created_at) as year,
MONTH(created_at) as month,
DAY(created_at) as day,
UPPER(status) as status_upper
')
->where('status', 'active')
->get();
return $res;
}
}
?>
Результат выполнения кода:
[
{"id": 1, "year": 2025, "month": 3, "day": 15, "status_upper": "ACTIVE"},
{"id": 2, "year": 2025, "month": 3, "day": 16, "status_upper": "ACTIVE"},
{"id": 3, "year": 2025, "month": 3, "day": 17, "status_upper": "ACTIVE"}
]
Пример
Используем условную конструкцию CASE для создания вычисляемого поля на основе существующих данных:
<?php
namespace AppHttpControllers;
use IlluminateSupportFacadesDB;
class ArticleController extends Controller
{
public function index()
{
$res = DB::table('users')
->selectRaw('
name,
age,
CASE
WHEN age < 18 THEN "minor"
WHEN age >= 18 AND age < 65 THEN "adult"
ELSE "senior"
END as age_group
')
->get();
return $res;
}
}
?>
Результат выполнения кода:
[
{"name": "user 1", "age": 16, "age_group": "minor"},
{"name": "user 2", "age": 25, "age_group": "adult"},
{"name": "user 3", "age": 70, "age_group": "senior"}
]
Смотрите также
-
метод
select,
который выбирает конкретные колонки из таблицы -
метод
addSelect,
который добавляет колонки к уже выбранным -
метод
whereRaw,
который добавляет сырое условие в WHERE -
метод
orderByRaw,
который сортирует результат по сырому выражению