[php] Comment faire exécuter la requête dans Laravel 5? DB :: getQueryLog retourne un tableau vide


Answers

Si tout ce qui vous intéresse vraiment est la requête réelle (la dernière exécution) à des fins de débogage rapide:

DB::enableQueryLog();

# your laravel query builder goes here

$laQuery = DB::getQueryLog();

$lcWhatYouWant = $laQuery[0]['query']; # <-------

# optionally disable the query log:
DB::disableQueryLog();

print_r() un print_r() sur $laQuery[0] pour obtenir la requête complète. (la variable $lcWhatYouWant ci-dessus aura les variables remplacées par ?? )

Question

DB :: getQueryLog retourne un tableau vide

$user = User::find(5);
print_r(DB::getQueryLog());

le résultat est un tableau vide

Array
(
)



Vous devez d'abord activer la journalisation des requêtes

DB::enableQueryLog();

Il serait préférable que vous activiez la journalisation des requêtes avant le démarrage de l'application, ce que vous pouvez faire dans un BeforeMiddleware, puis récupérer les requêtes exécutées dans AfterMiddleware.




(Laravel 5.2) Je trouve que le moyen le plus simple est juste d'ajouter une ligne de code pour surveiller les requêtes sql: \DB::listen(function($sql) {var_dump($sql); });




Ce code est pour:

  • Laravel 5,2
  • Connectez les instructions dans la base de données mysql

Voici le code, basé sur la réponse de @milz:

    DB::listen(function($sql) {
        $LOG_TABLE_NAME = 'log';
        foreach ($sql->bindings as $i => $binding) {
            if ($binding instanceof \DateTime) {
                $sql->bindings[$i] = $binding->format('\'Y-m-d H:i:s\'');
            } else {
                if (is_string($binding)) {
                    $sql->bindings[$i] = "'$binding'";
                }
            }
        }
        // Insert bindings into query
        $query = str_replace(array('%', '?'), array('%%', '%s'), $sql->sql);
        $query = vsprintf($query, $sql->bindings);
        if(stripos($query, 'insert into `'.$LOG_TABLE_NAME.'`')===false){
            $toLog = new LogModel();
            $toLog->uId = 100;
            $toLog->sql = $query;
            $toLog->save();
        }
    });

Le noyau est la ligne if(stripos... , qui empêche la récursion d'insérer l' insert into log instruction insert into log sql dans la base de données.




Related