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

Déboguer une requête21.1 Déboguer une requête Eloquent avec la méthode toSql()


Lorsqu'on bâtit une requête avec Eloquent et qu'elle ne réagit pas comme on l'avait prévu, il peut être difficile de voir à quel endroit se situe l'erreur.

Pour nous aider, nous pouvons utiliser la méthode toSql().

Attention : toSql() est une méthode terminale qui doit être exécutée sur un objet de type Builder (ex : Eloquent\Builder, Query\Builder ou objet de relation) et non sur une collection. Elle ne peut donc pas être appelée après un get() ou après un all().

Soit l'extrait de code suivant, qui génère l'erreur « BadMethodCallException. Method toSql does not exist. » puisqu'on tente d'appliquer toSql() sur une collection :

Contrôleur Laravel (PHP)

$produits = Produit::where('categorie_id', 3)

    ->has('photos')

    ->get();

 

\Log::debug($produits->toSql());

 

return $produits;

Pour corriger la situation, on peut remplacer le code par ceci :

Contrôleur Laravel (PHP)

$requete = Produit::where('categorie_id', 3)

    ->has('photos');

 

\Log::debug($requete->toSql());

 

return $requete->get();

La ligne suivante sera ajoutée au fichier laravel.log :

Fichier storage\logs\laravel.log

[AAAA-MM-JJ hh:mm:ss] local.DEBUG: select * from `produits` where `categorie_id` = ? and exists (select * from `photos` where `photos`.`produit_id` = `produits`.`id`)

Pour plus d'information

« Debugging Queries in Laravel ». Scotch.io. https://scotch.io/tutorials/debugging-queries-in-laravel

« Display all SQL executed in Eloquent ». Laravel Tricks. http://laravel-tricks.com/tricks/display-all-sql-executed-in-eloquent

« Log last executed Eloquent query as plain SQL in Laravel 5 ». GoodBytes. http://www.goodbytes.be/blog/article/log-last-executed-eloquent-query-as-plain-sql-in-laravel-5

▼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