logo

Генерация RAW SQL из Laravel Eloquent: примеры и методы

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

Если кратко, то в Laravel для преобразования SQL-запроса в строку можно использовать метод toSql(). Однако стоит помнить, что при этом запрос всего лишь выводится на экран, его выполнение не производится. Если в запросе есть подстановочные места, они требуют особого внимания.

php
Скопировать код
echo User::where('name', 'John')->toSql(); // Сегодня наш эксперимент базируется на экземпляре Джона.

Разбираем SQL изнутри: заметки цифрового детектива

Следите за исполнением: активируем логирование

При работе с SQL логирование станет вашим надежным инструментом в Laravel:

php
Скопировать код
\DB::enableQueryLog(); // Приступаем к испытаниям!
// Вызываем запрос на исполнение   
User::where('name', 'John')->get(); // И снова наш Джон!
// Выводим результаты работы 
dd(\DB::getQueryLog()); // Сообщение детектива: "Вот что я имею на основании изучения улик!"

Эта часть кода позволит вам отследить исходный SQL, привязки, а также отаку важную информацию как время выполнения запроса и название используемого подключения — не что иное зто отчет в полном объеме из мира детективов.

Заменяем заполнители: подставляем реальные значения вместо "заглушек"

Бесконечное появление заполнителей или так называемых 'плейсхолдеров(?)' уже начинает наскучивать? Произведите замену на фактические значения:

php
Скопировать код
$sql = User::where('name', 'John')->toSql(); // Фокусируемся на Джоне
$bindings = User::where('name', 'John')->getBindings(); // Разведка, отчитайтесь о положении!
$boundSql = vsprintf(str_replace(['?'], ['\'%s\''], $sql), $bindings); // Вуаля! '?' не остался одиноким!
echo $boundSql;

Мы успешно заменили плейсхолдеры на соответствующие фактические значения, упростили чтение SQL-запроса и позволили (?) вернуться в свое естественное состояние!

Специализированный инструментарий шпиона: мониторинг SQL в режиме реального времени

Если вы испытываете азарт от преследования наблюдений в режиме реального времени, Laravel предоставляет вам возможность отслеживать SQL-запросы в момент их выполнения. Для этого используется специальный слушатель событий:

php
Скопировать код
\Event::listen('illuminate.query', function($query, $bindings, $time, $connectionName) {
    // Форматируем полученный запрос и преобразуем его
});

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

Чтобы облегчить понимание, представьте конструктор запросов в образе ткацкого станка (🚪):

Вы ткуте ковер (🧶), создавая сложные орнаменты и рисунки.

SQL
Скопировать код
SELECT * FROM users WHERE active = 1

Результатом становится прекрасный ковер для шагания (🏞️), но куда бы ушел исходный проект, который вы разработали?

Дверь (🚪) к этим дизайновым разработкам открывается, когда вы надеваете свои волшебные очки (🔍):

SQL
Скопировать код
-- Взгляд сквозь (🔍)
carpet.showRoadmap() // Итог: "SELECT * FROM users WHERE active = 1"

В вашим распоряжении находится простая, исходная SQL-карта (🏞️), дверь, ведущая к вашему великолепному творению.

Отладка с элегантностью: раскрываем потенциал производительности

Разберите всё досконально!

Систематически анализируйте данные SQL-транзакции для детальной отладки:

Сам SQL-запрос — общая суть вашего запроса. Привязки или параметры — факторы, делающие ваш запрос уникальным. Время выполнения — показатель эффективности вашего запроса. Информация о подключении — уточняет место выполнения вашего запроса.

Добавьте немного стиля в свои инструменты!

Повысьте уровень своей работы с помощью Eloquent debug bar или пакета laravel-telescope для наиболее интуитивно понятного интерфейса отладки — отладка ведь тоже может быть эстетическа приятной!

Пользовательское логирование: отладка еще никогда не была такой простой

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

php
Скопировать код
customLogFunction(); // Шара-кадабра! Ваши SQL-туфли готовы!

Изучайте, но не трогайте! Осторожно обращайтесь с данными

Если вы используете функцию для внедрения привязок в запрос, не забывайте, что они могут иметь различные типы. Отсюда следует необходимость проверки типа данных прежде, чем преобразовывать их в строку:

php
Скопировать код
if (gettype($binding) === 'string') {
    str_replace('?', "'" . $binding . "'", $query);
} else {
    str_replace('?', $binding, $query);
}

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

  1. Документация Laravel – Логирование запросов для отладки — Найдите SQL-злодея с помощью логирования запросов к базе данных в Laravel.
  2. Entity Framework Core – Логирование/перехват операций с базой данных — Официальные рекомендации по логированию и предупреждению неправомерных действий в базах данных с использованием EF Core.
  3. Rails – Интерфейс отладки запросов Active Record — Руководство Ruby on Rails по решению проблем, связанных с базами данных.
  4. API QuerySet Django – Преобразование запросов в SQL-строки — Документация Django по трансляции запросов QuerySet в SQL-строки.
  5. ORM Sequelize Node.js – Извлечение SQL-запроса из конструктора запросов — Разгадываем тайны Sequelize необработанных запросов в Node.js.