Il est possible que vous ayez déjà utilisé le QueryBuilder de Laravel pour effectuer une requête, mais que son comportement ne corresponde pas à vos attentes, dans ce cas, vous pourriez être à la recherche d’une manière de voir le détail d’une requête SQL avec Laravel.
![Image de l'article : Voir le détail d'une requête SQL avec Laravel](https://explain.code-to.me/app/uploads/2023/07/explain-code-me-sql-laravel-querybuilder.jpeg)
Voir le détail d’une requête SQL avec Laravel 10 et plus
Suite à une modification récente (ou Pull Request) de Laravel 10, il est maintenant possible d’afficher précisément le contenu d’une requête SQL grâce au code suivant :
$sql = User::where('email', 'foo@example.com')
->toRawSql();
# Output
$sql = "SELECT * FROM users WHERE email = 'foo@example.com'"
User::where('email', 'foo@example.com')
->dumpRawSql();
# Output
"SELECT * FROM users WHERE email = 'foo@example.com'"
User::where('email', 'foo@example.com')
->ddRawSql();
# Output
"SELECT * FROM users WHERE email = 'foo@example.com'"
$sql = DB::connection()->getQueryGrammar()->makeRawSql(
'SELECT * FROM users WHERE email = ?',
'foo@example.com',
);
# Output
$sql = "SELECT * FROM users WHERE email = 'foo@example.com'"
With previous patches being merged into Laravel, I was now able to create one that has been requested for quite some years:
— Tobias_Petry.sql (@tobias_petry) June 20, 2023
User::where(…)->ddRawSql()
It prints the generated SQL query *with* bindings embedded safely into the query 🤯https://t.co/3lSfaGooKH
Examiner une requête SQL avec Laravel 9 et moins
Prenons en exemple la requête suivante :
$users = User::where('name', 'like', '%John%')->get();
Il vous faudra remplacer l’instruction ->get()
par ->toSql()
pour obtenir le SQL brute de cette dernière. Cependant, vous pourriez remarquer que cette requête affiche des « ?
» à la place des données envoyées.
$rawSql = $users->toSql();
dump($rawSql);
# Output
"select * from `users` where `name` like ?"
Maintenant, comment pouvons-nous examiner en détail une requête SQL avec Laravel 9 et moins pour nous assurer que les données sont correctes ?
Pour cela, il vous faudra utiliser la méthode ->getBindings()
, qui vous permettra d’afficher les données envoyées dans la requête SQL :
$bindings = $users->getBindings();
dump($bindings);
# Output
["%John%"]
Il est aussi possible de fusionner ces 2 méthodes avec Laravel 9 et moins grâce à la fonction suivante :
Function previewSql()
{
$users = User::where(‘id’, 0);
$users->union(User::where(‘id’, 1));
$users->union(User::where(‘id’, 2));
$users->union(User::where(‘id’, 3));
// Preview sql statement using getBindings() and toSql() builder methods
echo(Str::replaceArray(‘?’, $users->getBindings(), $users->toSql()));
/**
OUTPUT
"(select * from `users` where `id` = 0)
union (select * from `users` where `id` = 1)
union (select * from `users` where `id` = 2)
union (select * from `users` where `id` = 3)
"
**/
}
Happy coding!