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 :
$produits = Produit::where('categorie_id', 3)
->has('photos')
->get();
return $produits;
Pour corriger la situation, on peut remplacer le code par ceci :
$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 :
[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`)
« 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é