Вывод Builder SQL запроса с переданными значениями
09.11.2021
57

Вывод Builder SQL запроса с переданными значениями

Для анализа SQL запросов в Laravel из коробки присутствует метод toSql класса \Illuminate\Database\Eloquent\Builder. Но данный метод возвращает представление (prepared statements) sql запроса без указанных переменных, что не всегда удобно.


На примере модели User получим Builder: 


$builder = \App\Models\User::whereName('Hello')->whereEmail('hello@example.com');
dd($builder->toSql());
// select * from `users` where `name` = ? and `email` = ?


Результат метода toSql вернул плейсхолдеры.


Чтобы реализовать подмену плесйхолдеров на реальные данные, необходимо заменить их на значения из метода getBindings().


Реализовать подмену можно при помощи добавления макроса разместив код в файле AppServiceProvider.php метода boot:



\Illuminate\Database\Eloquent\Builder::macro(
    'toSqlString',
    function () {
        /** @var \Illuminate\Database\Eloquent\Builder */
        $builder = $this;

        /** @var string */
        $sql = $builder->toSql();

        $query = $sql;

        foreach ($builder->getBindings() as $binding) {
            /** @var string */
            $value = is_numeric($binding) ? $binding : "'" . $binding . "'";
            $replace = preg_replace('/\?/', $value, $query, 1);
            if (is_string($replace)) {
                $query = $replace;
            }
        }

        return $query;
    }
);


Макрос расширяет методы класса \Illuminate\Database\Eloquent\Builder добавляя toSqlString(). Используя метод toSqlString() выведем полный sql запрос:


$builder = \App\Models\User::whereName('Hello')->whereEmail('hello@example.com');
dd($builder->toSqlString());
// select * from `users` where `name` = 'Hello' and `email` = 'hello@example.com'


Источник: ZetRider
Laravel Nova: Множественные поля
28.10.2021
67
Laravel Nova: Множественные поля

Множественные поля для Laravel Nova основаны на хранении данных в json формате свойства модели.GitHubУстановка:composer require zetrider/nova-inputs-f...

Читать →
Тестирование и отладка роутов Laravel при помощи DebugBar
09.10.2021
107
Тестирование и отладка роутов Laravel при помощи DebugBar

Для тестирования роутов на наличие дубликата sql запросов, потребления памяти или времени загрузки можно использовать удобный интерфейс laravel-debugb...

Читать →
Laravel Nova - Как вывести в трендах сумму за период
24.02.2021
627
Laravel Nova - Как вывести в трендах сумму за период

В Laravel Nova удобно отображать метрики через тренды. Создавая периоды можно получить информацию например о новых пользователях в системе. В одном пр...

Читать →