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 :
// 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 :
[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.
[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 :
[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é