Laravel: Регистрация sql-запроса с его привязками

Чаще всего разработчики 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`
Вход в полноэкранный режим Выход из полноэкранного режима

Продолжайте учиться!!!

Оцените статью
devanswers.ru
Добавить комментарий