Метод raw
Метод raw класса DB применяется для создания сырых SQL-выражений, которые не экранируются и не обрабатываются как параметры. В отличие от обычных методов, где значения автоматически экранируются для защиты от SQL-инъекций, метод raw позволяет вставлять чистый SQL-код в запрос. Это полезно, когда требуется использовать функции базы данных, операторы или сложные выражения, которые невозможно выразить через стандартные методы построителя запросов. Первым и единственным параметром передаётся строка с SQL-выражением.
Синтаксис
<?php
DB::raw($expression);
?>
Пример с функцией базы данных
Давайте выберем статьи, отсортировав их по длине заголовка с помощью функции LENGTH:
<?php
use Illuminate\Support\Facades\DB;
use AppModelsArticle;
$articles = Article::orderBy(DB::raw('LENGTH(title)'))->get();
foreach ($articles as $article) {
echo $article->title . "\n";
}
?>
Результат выполнения кода:
"abc"
"abcde"
"abcdefgh"
"abcdefghijk"
Пример с арифметическим выражением
Давайте выберем пользователей, у которых сумма полей views и likes больше 100:
<?php
use Illuminate\Support\Facades\DB;
use AppModelsUser;
$users = User::where(DB::raw('views + likes'), '>', 100)->get();
foreach ($users as $user) {
echo $user->name . "\n";
}
?>
Результат выполнения кода:
"user"
"user 1"
"user 4"
Пример с условным выражением CASE
Давайте выберем статьи с вычисляемым полем, которое показывает статус на основе количества просмотров:
<?php
use Illuminate\Support\Facades\DB;
use AppModelsArticle;
$articles = Article::select(
'title',
DB::raw("
CASE
WHEN views > 1000 THEN 'popular'
WHEN views > 100 THEN 'regular'
ELSE 'new'
END as popularity
")
)->get();
foreach ($articles as $article) {
echo $article->title . ' - ' . $article->popularity . "\n";
}
?>
Результат выполнения кода:
"article 1 - popular"
"article 2 - regular"
"article 3 - new"
"article 4 - popular"
Пример с конкатенацией строк
Давайте сформируем полное имя пользователя, объединив поля first_name и last_name через пробел:
<?php
use Illuminate\Support\Facades\DB;
use AppModelsUser;
$users = User::select(
DB::raw("CONCAT(first_name, ' ', last_name) as full_name")
)->get();
foreach ($users as $user) {
echo $user->full_name . "\n";
}
?>
Результат выполнения кода:
"John Doe"
"Jane Smith"
"Bob Johnson"