Чаще всего разработчики laravel предпочитают регистрировать sql-запрос с помощью приведенного ниже фрагмента.
DB::listen(function ($query) {
info('Query', [
"Query" => $query->sql,
"Bindings" => $query->bindings,
"Time" => $query->time,
]);
});
Но недостатком этого является разделение запроса, sql привязки и времени.
Мы можем сделать это лучшим способом, объединив запрос и его привязки с помощью laravel
Macroable Trait.
Добавьте приведенный ниже фрагмент в AppServiceProvider
и все готово.
Builder::macro('toSqlWithBindings', function () {
$bindings = array_map(fn($value) =>
is_numeric($value) ? $value : "'{$value}'",
$this->getBindings()
);
return Str::replaceArray(
'?', $bindings, $this->toSql()
);
});
Большинство классов laravel illuminate по умолчанию используют Macroable Trait. Используя его, мы можем добавить нашу пользовательскую функцию к этому классу illuminate. Эти функции доступны как функции класса, поэтому мы можем подключить пользовательскую функцию к построителю запросов.
$query = User::where('name', 'like' , '%admin%');
$query->toSqlWithBindings();
Вывод
select * from `users` where `name` like '%admin%' and `users`.`deleted_at` is null`
Продолжайте учиться!!!