Преобразование raw SQL-запросов в Laravel 5.1: решение

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Для выполнения собственных SQL-запросов в Laravel 5.1 необходимо использовать фасад DB:

  • Для чтения:

    php
    Скопировать код
    $users = DB::select('SELECT * FROM users WHERE active = ?', [1]);
  • Для записи:

    php
    Скопировать код
    DB::insert('INSERT INTO users (id, name) VALUES (?, ?)', [1, 'John']);
  • Для обновления:

    php
    Скопировать код
    DB::update('UPDATE users SET votes = 100 WHERE name = ?', ['John']);
  • Для удаления:

    php
    Скопировать код
    DB::delete('DELETE FROM users WHERE name = ?', ['John']);

Применяйте параметры для предохранения от SQL-инъекций. Выбирите метод, соответствующий типу SQL-операции.

Кинга Идем в IT: пошаговый план для смены профессии

Не только CRUD

В сложных сценариях, когда необходимо, например, создать таблицу или выполнить специальные SQL-операции, используйте:

НЕВЫБОРОЧНАЯ SQL-операция:

php
Скопировать код
DB::statement('CREATE TABLE IF NOT EXISTS test_table (id int, name varchar(255))');

Несколько операций или специфический SQL:

php
Скопировать код
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

php
Скопировать код
$users = DB::table('users')
           ->leftJoin('posts', 'users.id', '=', 'posts.user_id')
           ->select('users.*', 'posts.title as post_title')
           ->get();

UNION

php
Скопировать код
$first = DB::table('users')->whereNull('updated_at');
$second = DB::table('posts')->whereNull('deleted_at');
$union = $first->union($second)->get();

Группировка, Сортировка и Сырой SQL

Применение непосредственного SQL в Laravel раскрывает новые возможности, особенно при группировке и сортировке:

php
Скопировать код
$grouped = DB::select('SELECT type, COUNT(*) as count FROM products GROUP BY type ORDER BY count DESC');

Аккуратные имена и псевдонимы

Ошибки вида "Неопределённое свойство" часто возникают из-за путаницы с именами столбцов. Тщательно проверяйте SQL-синтаксис и псевдонимы таблиц:

php
Скопировать код
$result = DB::select('SELECT u.id as user_id, u.name FROM users as u');

Профессиональная эффективность

Чтобы оптимизировать запросы, используйте ->first(), если вам нужна только одна строка:

php
Скопировать код
$user = DB::table('users')->where('name', 'Джон')->first();

Визуализация

Eloquent ORM в Laravel как верный помощник, но прямой SQL может стать оружием, готовым влучить в цель с первого же залпа.

Запрос через Eloquent:

php
Скопировать код
$users = User::where('votes', '>', 100)->get();

Прямой SQL-запрос в Laravel:

php
Скопировать код
$results = DB::select(DB::raw('SELECT * FROM users WHERE votes > 100'));

SQL в чистом виде

Непосредственный SQL проявляет свою мощь в сложных конструкциях и подзапросах:

Сложные объединения:

php
Скопировать код
$complexJoin = DB::select('SELECT * FROM users u JOIN orders o ON u.id = o.user_id WHERE o.total > 500');

Подзапросы:

php
Скопировать код
$subquery = DB::select('SELECT * FROM (SELECT * FROM orders WHERE total > 500) as sub_orders');

Полезные материалы

  1. Database: Query Builder – Laravel 5.1 – Фреймворк PHP для веб-мастеров — официальная документация Laravel 5.1 по работе с сырыми выражениями.
  2. c++ – Возможно ли отладить Perl, содержащий секции XS, чтобы проследить за выполнением программы? – Stack Overflow — дискуссия о лучших методах выполнения прямых SQL-запросов в Laravel, несмотря на вводящий в заблуждение заголовок, который действительно касается Laravel.
  3. GitHub – laravel/framework: Фреймворк Laravel — исходный код Laravel на GitHub, полезный для изучения механизма работы фреймворка.
  4. Laravel News — статья о применении прямых SQL-запросов в Laravel.
  5. YouTube – Laravel с нуля: Непосредственные запросы к базе данных — видеоурок о работе с прямыми запросами в Laravel.