Astuce Laravel // Voir le détail d’une requête SQL avec Laravel

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

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'"



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!

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.