Introduction : Quand Query Builder se tait, mais que vous devez voir le SQL
\n\nAvez-vous déjà écrit une requête complexe avec Query Builder, exécuté celle-ci — et obtenu une erreur ou des données incorrectes ? Vous avez hâte de voir ce que votre chaîne de méthodes génère réellement, mais le framework vous renvoie obstinément un objet, pas une chaîne de caractères. Une situation familière ?
\n\nCette question est l'une des plus populaires sur Stack Overflow (des dizaines de milliers de vues). Et pour cause. Savoir "extraire" le SQL brut de Query Builder est un super-pouvoir qui vous fait gagner des heures de débogage. Surtout lorsque vous travaillez avec un ORM comme Doctrine ou Eloquent dans Laravel, où les requêtes sont construites via une chaîne de méthodes, et que le SQL réel est caché à l'intérieur.
\n\nDans cet article, nous allons voir comment obtenir une chaîne SQL brute depuis Query Builder dans différents frameworks PHP, montrer des exemples de code et expliquer pourquoi c'est important pour chaque développeur. C'est parti !
\n\n1. Pourquoi auriez-vous besoin de SQL brut ?
\n\nAvant de plonger dans le code, comprenons pourquoi il est utile de regarder le SQL "brut", alors que Query Builder fait tout pour nous.
\n\n- \n
- Débogage des erreurs. Lorsqu'une requête ne fonctionne pas, vous ne voyez qu'un objet. Mais le SQL, c'est la vérité. Vous verrez quelles tables sont jointes, quelles conditions WHERE sont appliquées, et où se trouve l'erreur de syntaxe. \n
- Optimisation des performances. Query Builder peut générer une requête inefficace. En la regardant, vous remarquerez des JOIN superflus ou l'absence d'index. \n
- Apprentissage. Si vous êtes débutant, voir le SQL généré vous aide à comprendre comment l'ORM traduit vos méthodes PHP en commandes SQL réelles. \n
- Export et journalisation. Parfois, vous devez enregistrer la requête dans un journal ou l'envoyer à un autre service. Sans une chaîne, c'est impossible. \n
Passons maintenant à la partie la plus intéressante : le code.
\n\n2. Laravel Eloquent : toSql() et getBindings()
\n\nLaravel est le framework PHP le plus populaire, et son Query Builder (partie d'Eloquent) fournit des méthodes intégrées pour obtenir le SQL. Voici comment cela fonctionne.
\n\nExemple simple : toSql()
\n\nuse Illuminate\\Support\\Facades\\DB;\n\n$query = DB::table('users')\n ->where('age', '>', 18)\n ->where('status', 'active')\n ->orderBy('name', 'asc');\n\n$sql = $query->toSql();\n\necho $sql;\n// Affiche : select * from `users` where `age` > ? and `status` = ? order by `name` asc\n\nParfait ! Mais vous avez remarqué les points d'interrogation ? Ce sont des espaces réservés pour les requêtes préparées. Pour voir les valeurs réelles, vous devez utiliser getBindings().
SQL complet avec substitution des valeurs
\n\n$bindings = $query->getBindings();\n\n$fullSql = vsprintf(str_replace('?', '%s', $sql), array_map(function ($value) {\n return is_numeric($value) ? $value : "'" . $value . "'";\n}, $bindings));\n\necho $fullSql;\n// Affiche : select * from `users` where `age` > 18 and `status` = 'active' order by `name` asc\n\nCette astuce remplace les espaces réservés par les valeurs réelles. Mais attention : n'utilisez pas cette méthode pour exécuter la requête — elle n'échappe pas les données, c'est uniquement pour le débogage.
\n\nLa méthode dd() pour un débogage rapide
\n\nDans Laravel, il existe une méthode pratique dd() (dump and die) qui affiche le SQL et les bindings :
DB::table('users')->where('age', '>', 18)->dd();\n// Arrête l'exécution et affiche :\n// sql: select * from `users` where `age` > ?\n// bindings: [18]\n\nConseil : Utilisez dd() uniquement dans un environnement de développement. En production, il tuera la requête.
3. Doctrine ORM : getSQL() et paramètres
\n\nDoctrine est un ORM puissant, utilisé dans Symfony et d'autres projets. Son Query Builder est légèrement différent, mais le principe reste le même.
\n\nExemple de base
\n\nuse Doctrine\\ORM\\EntityManagerInterface;\n\n// Supposons que $entityManager soit déjà obtenu via DI\n$queryBuilder = $entityManager->createQueryBuil