Laravel. Как вывести запрос со значениями (query with bindings)?


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

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

Метод выглядит так:

public static function getSqlWithParams( &$query ){
        return vsprintf(
                str_replace(
                    '?',
                    '%s',
                    $query->toSql()
                ),
                collect(
                    $query->getBindings()
                )->map(function ($binding) {
                    $binding = addslashes($binding);
                    return is_numeric($binding) ? $binding : "'{$binding}'";
                })->toArray()
        ) ;
    }

Этот метод принимает экземпляр Builder и возвращает подготовленный запрос.

Пример вызова ниже (допустим, что метод лежит в условном классе EloquentHelper):

$query = News::whereIn('status', ['new', 'posted', 'blocked']) ;
dd([
    $query->toSql(),
    EloquentHelper::getSqlWithParams( $query )
]);

Для наглядного сравнения выводим и обычный toSql() и наш новый метод.

Итак, приведенный выше пример вернет нам примерно такую строку-запрос toSql():

SELECT * FROM `news` WHERE `status` IN (?, ?, ?)

И такую строку, как результат работы нашего метода.

SELECT * FROM `news` WHERE `status` IN ('new', 'posted', 'blocked')

Очевидно, что второй вариант существенно упрощает жизнь при дебаге.

надеюсь статья была Вам полезной. Удачи!

,

Добавить комментарий

Ваш адрес email не будет опубликован.