Преобразование raw SQL-запросов в Laravel 5.1: решение
Быстрый ответ
Для выполнения собственных SQL-запросов в Laravel 5.1 необходимо использовать фасад DB
:
Для чтения:
$users = DB::select('SELECT * FROM users WHERE active = ?', [1]);
Для записи:
DB::insert('INSERT INTO users (id, name) VALUES (?, ?)', [1, 'John']);
Для обновления:
DB::update('UPDATE users SET votes = 100 WHERE name = ?', ['John']);
Для удаления:
DB::delete('DELETE FROM users WHERE name = ?', ['John']);
Применяйте параметры для предохранения от SQL-инъекций. Выбирите метод, соответствующий типу SQL-операции.
Не только CRUD
В сложных сценариях, когда необходимо, например, создать таблицу или выполнить специальные SQL-операции, используйте:
НЕВЫБОРОЧНАЯ SQL-операция:
DB::statement('CREATE TABLE IF NOT EXISTS test_table (id int, name varchar(255))');
Несколько операций или специфический SQL:
DB::unprepared('DROP PROCEDURE IF EXISTS add_item;
CREATE PROCEDURE add_item(IN name VARCHAR(255), OUT id INT)
BEGIN
INSERT INTO items (name) VALUES (name);
SET id = LAST_INSERT_ID();
END');
Объединения (Joins) и Объединения с условием (Unions)
Когда требуется выполнить отличный от стандартного SQL-запрос:
LEFT JOIN
$users = DB::table('users')
->leftJoin('posts', 'users.id', '=', 'posts.user_id')
->select('users.*', 'posts.title as post_title')
->get();
UNION
$first = DB::table('users')->whereNull('updated_at');
$second = DB::table('posts')->whereNull('deleted_at');
$union = $first->union($second)->get();
Группировка, Сортировка и Сырой SQL
Применение непосредственного SQL в Laravel раскрывает новые возможности, особенно при группировке и сортировке:
$grouped = DB::select('SELECT type, COUNT(*) as count FROM products GROUP BY type ORDER BY count DESC');
Аккуратные имена и псевдонимы
Ошибки вида "Неопределённое свойство" часто возникают из-за путаницы с именами столбцов. Тщательно проверяйте SQL-синтаксис и псевдонимы таблиц:
$result = DB::select('SELECT u.id as user_id, u.name FROM users as u');
Профессиональная эффективность
Чтобы оптимизировать запросы, используйте ->first()
, если вам нужна только одна строка:
$user = DB::table('users')->where('name', 'Джон')->first();
Визуализация
Eloquent ORM в Laravel как верный помощник, но прямой SQL может стать оружием, готовым влучить в цель с первого же залпа.
Запрос через Eloquent:
$users = User::where('votes', '>', 100)->get();
Прямой SQL-запрос в Laravel:
$results = DB::select(DB::raw('SELECT * FROM users WHERE votes > 100'));
SQL в чистом виде
Непосредственный SQL проявляет свою мощь в сложных конструкциях и подзапросах:
Сложные объединения:
$complexJoin = DB::select('SELECT * FROM users u JOIN orders o ON u.id = o.user_id WHERE o.total > 500');
Подзапросы:
$subquery = DB::select('SELECT * FROM (SELECT * FROM orders WHERE total > 500) as sub_orders');
Полезные материалы
- Database: Query Builder – Laravel 5.1 – Фреймворк PHP для веб-мастеров — официальная документация Laravel 5.1 по работе с сырыми выражениями.
- c++ – Возможно ли отладить Perl, содержащий секции XS, чтобы проследить за выполнением программы? – Stack Overflow — дискуссия о лучших методах выполнения прямых SQL-запросов в Laravel, несмотря на вводящий в заблуждение заголовок, который действительно касается Laravel.
- GitHub – laravel/framework: Фреймворк Laravel — исходный код Laravel на GitHub, полезный для изучения механизма работы фреймворка.
- Laravel News — статья о применении прямых SQL-запросов в Laravel.
- YouTube – Laravel с нуля: Непосредственные запросы к базе данных — видеоурок о работе с прямыми запросами в Laravel.