Le générateur de requêtes Laravel gère efficacement les sous-requêtes
Lorsqu'ils utilisent Eloquent ORM pour récupérer des données à partir de sous-requêtes, les développeurs utilisent souvent une combinaison de toSql()
et de requêtes natives. Bien que cette approche fonctionne, elle n'est pas assez intuitive. Une solution plus efficace est proposée ici :
Par exemple, pour extraire le nombre de résultats de la sous-requête suivante :
<code class="language-sql">SELECT COUNT(*) FROM ( SELECT * FROM abc GROUP BY col1 ) AS a;</code>
Laravel nous permet de fusionner des requêtes natives en requêtes Eloquent en utilisant mergeBindings
. Tout d’abord, nous créons une instance Eloquent Builder pour la sous-requête :
<code class="language-php">$sub = Abc::where(..)->groupBy(..);</code>
Nous utilisons ensuite DB::table
pour créer une nouvelle table qui référence la sous-requête et définir manuellement les liaisons correspondantes :
<code class="language-php">$count = DB::table( DB::raw("({$sub->toSql()}) as sub") ) ->mergeBindings($sub->getQuery()) // 获取底层查询构造器 ->count();</code>
Cette approche garantit que les liaisons correctes sont appliquées à la requête fusionnée pour obtenir les résultats souhaités sans avoir besoin de manipulation manuelle des chaînes.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!