Генерация RAW SQL из Laravel Eloquent: примеры и методы
Пройдите тест, узнайте какой профессии подходите
Быстрый ответ
Если кратко, то в Laravel для преобразования SQL-запроса в строку можно использовать метод toSql()
. Однако стоит помнить, что при этом запрос всего лишь выводится на экран, его выполнение не производится. Если в запросе есть подстановочные места, они требуют особого внимания.
echo User::where('name', 'John')->toSql(); // Сегодня наш эксперимент базируется на экземпляре Джона.
Разбираем SQL изнутри: заметки цифрового детектива
Следите за исполнением: активируем логирование
При работе с SQL логирование станет вашим надежным инструментом в Laravel:
\DB::enableQueryLog(); // Приступаем к испытаниям!
// Вызываем запрос на исполнение
User::where('name', 'John')->get(); // И снова наш Джон!
// Выводим результаты работы
dd(\DB::getQueryLog()); // Сообщение детектива: "Вот что я имею на основании изучения улик!"
Эта часть кода позволит вам отследить исходный SQL, привязки, а также отаку важную информацию как время выполнения запроса и название используемого подключения — не что иное зто отчет в полном объеме из мира детективов.
Заменяем заполнители: подставляем реальные значения вместо "заглушек"
Бесконечное появление заполнителей или так называемых 'плейсхолдеров(?)' уже начинает наскучивать? Произведите замену на фактические значения:
$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-запросы в момент их выполнения. Для этого используется специальный слушатель событий:
\Event::listen('illuminate.query', function($query, $bindings, $time, $connectionName) {
// Форматируем полученный запрос и преобразуем его
});
Визуализация
Чтобы облегчить понимание, представьте конструктор запросов в образе ткацкого станка (🚪):
Вы ткуте ковер (🧶), создавая сложные орнаменты и рисунки.
SELECT * FROM users WHERE active = 1
Результатом становится прекрасный ковер для шагания (🏞️), но куда бы ушел исходный проект, который вы разработали?
Дверь (🚪) к этим дизайновым разработкам открывается, когда вы надеваете свои волшебные очки (🔍):
-- Взгляд сквозь (🔍)
carpet.showRoadmap() // Итог: "SELECT * FROM users WHERE active = 1"
В вашим распоряжении находится простая, исходная SQL-карта (🏞️), дверь, ведущая к вашему великолепному творению.
Отладка с элегантностью: раскрываем потенциал производительности
Разберите всё досконально!
Систематически анализируйте данные SQL-транзакции для детальной отладки:
Сам SQL-запрос — общая суть вашего запроса. Привязки или параметры — факторы, делающие ваш запрос уникальным. Время выполнения — показатель эффективности вашего запроса. Информация о подключении — уточняет место выполнения вашего запроса.
Добавьте немного стиля в свои инструменты!
Повысьте уровень своей работы с помощью Eloquent debug bar
или пакета laravel-telescope
для наиболее интуитивно понятного интерфейса отладки — отладка ведь тоже может быть эстетическа приятной!
Пользовательское логирование: отладка еще никогда не была такой простой
Используйте функционал пользовательского логирования, чтобы всегда держать под контролем SQL-запросы и привязки в наиболее удобном для вас формате:
customLogFunction(); // Шара-кадабра! Ваши SQL-туфли готовы!
Изучайте, но не трогайте! Осторожно обращайтесь с данными
Если вы используете функцию для внедрения привязок в запрос, не забывайте, что они могут иметь различные типы. Отсюда следует необходимость проверки типа данных прежде, чем преобразовывать их в строку:
if (gettype($binding) === 'string') {
str_replace('?', "'" . $binding . "'", $query);
} else {
str_replace('?', $binding, $query);
}
Полезные материалы
- Документация Laravel – Логирование запросов для отладки — Найдите SQL-злодея с помощью логирования запросов к базе данных в Laravel.
- Entity Framework Core – Логирование/перехват операций с базой данных — Официальные рекомендации по логированию и предупреждению неправомерных действий в базах данных с использованием EF Core.
- Rails – Интерфейс отладки запросов Active Record — Руководство Ruby on Rails по решению проблем, связанных с базами данных.
- API QuerySet Django – Преобразование запросов в SQL-строки — Документация Django по трансляции запросов QuerySet в SQL-строки.
- ORM Sequelize Node.js – Извлечение SQL-запроса из конструктора запросов — Разгадываем тайны Sequelize необработанных запросов в Node.js.