RusPOPsy
@RusPOPsy
Говорила мама, учи математику ...

Как перехватить и модифицировать запрос в базу до его выполнения?

Есть задача перехватывать и добавлять комментарий к любому SQL запросу.
Что то в документации кроме ModelObserver и DB::listen я ничего не нашел ...
ModelObserver не подходит, потому что будет отслеживать только запросы из моделей.
DB::listen уже после его выполнения.

хотелось бы что то какое:
DB::beforeExecute(function($query){
    return $query . " -- некоторый комментарий к запросу"
})


есть ли варианты?
  • Вопрос задан
  • 339 просмотров
Пригласить эксперта
Ответы на вопрос 3
@Nc_Soft
Это можно сделать по-быстрому модифицировав сорцы фреймворка
файл vendor/laravel/framework/src/Illuminate/Database/Connection.php
модифицируем метод run (строка 620)
protected function run($query, $bindings, Closure $callback)
    {
         $query.= '-- this is test comment';
        // остальной код

После этого ко всем запросам будет цепляться комментарий.
Чтобы сделать это по-правильному надо идти в config.app и писать кастомный провайдер, который заменит
Illuminate\Database\DatabaseServiceProvider::class
разбираться с db.factory и прочим ларавеловским дрочевом, но мне просто лень это делать, просто указал куда копать.
Ответ написан
Sanasol
@Sanasol Куратор тега Laravel
нельзя просто так взять и загуглить ошибку
@inFureal
Можно через обсерверы или ивенты в самой модели. Прикол в том, что нигде (вроде) не говориться какие ивенты есть.
Допустим при make:observer создается created, updated, deleted, но есть же и другие.
Например можно сделать
class ProductObserver {
    function saving(Product $product) {} // будет выполняться после каждого вызова save и ДО запроса в базу
    function saved(Product $product) {} // будет выполняться после вызова save и ПОСЛЕ запроса в базу
}

// В провайдере
Product::observe(ProductObserver::class);

или внутри модели
<code lang="php">
class Product extends Model {
    // ...
    static function boot() {
        parent::boot();
        static::saving(function(Product $product) {}); // то же самое что и выше пример
    }
    // ....
}
</code>
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы