Formation PUB030 : Laravel, 2019 Déboguer une requête

21.3 getQueryLog() : pour en savoir plus sur les requêtes SQL générées par Eloquent


L'instruction \DB::listen permet de voir les requêtes générées par Eloquent . D'autres techniques permettent d'y arriver, par exemple \DB::connection()->enableQueryLog();.

Ex :

Contrôleur Laravel (PHP)

// Inspiré de : http://www.goodbytes.be/blog/article/log-last-executed-eloquent-query-as-plain-sql-in-laravel-5

\DB::connection()->enableQueryLog();

 

Produit::join('categories', 'categorie_id', '=', 'categorie.id')

    ->orderBy('categories.description')

    ->orderBy('produits.prix')

    ->get();

 

$query = \DB::getQueryLog();

$lastQuery = end($query);

\Log::debug(compact('lastQuery'));

\DB::connection()->disableQueryLog();

Important : afin de ne pas alourdir votre site inutilement, n'oubliez pas d'enlever les lignes en jaune quand votre requête sera déboguée.

Les instructions précédentes afficheront ceci dans le fichier laravel.log :

Fichier laravel.log

[AAAA-MM-JJ hh:mm:ss] local.DEBUG: array (

  'lastQuery' => 

  array (

    'query' => 'select * from `produits` inner join `categories` on `categorie_id` = `cagetories`.`id` order by `categories`.`description` asc, `produits`.`prix` asc',

    'bindings' => 

    array (

    ),

    'time' => 0.51000000000000001,

  ),

)

Dans le cas où la requête contient des paramètres, les paramètres apparaîtront sous forme de points d'interrogation et leur valeur sera affichée dans l'élément bindings.

Fichier laravel.log

[AAAA-MM-JJ hh:mm:ss] local.DEBUG: array (

  'lastQuery' => 

  array (

    'query' => 'select * from `produits` where `produits`.`id` = ?',

    'bindings' => 

    array (

      0 => '3',

    ),

    'time' => 0.51000000000000001,

  ),

)

Si vous obtenez quelque chose du genre :

Fichier laravel.log

[AAAA-MM-JJ hh:mm:ss] local.DEBUG: array (

  'lastQuery' => false,

c'est probablement parce que votre requête retourne un objet de type Builder. Vous devez ajouter une méthode terminale pour que la requête soit effectivement exécutée.

▼Publicité

Veuillez noter que le contenu de cette fiche vous est partagé à titre gracieux, au meilleur de mes connaissances et sans aucune garantie.
Merci de partager !
Soumettre