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')
Очевидно, что второй вариант существенно упрощает жизнь при дебаге.
надеюсь статья была Вам полезной. Удачи!