Maison >base de données >tutoriel mysql >Comment compter efficacement les enregistrements d'une sous-requête Laravel avec GROUP BY ?
Sélection de sous-requête dans le générateur de requêtes Laravel
La sélection de données à partir d'une sous-requête à l'aide du générateur de requêtes d'Eloquent ORM peut s'avérer difficile. Cet article traite d'un problème spécifique rencontré par un utilisateur qui souhaitait obtenir le nombre d'enregistrements pour une sous-requête créée à l'aide de GROUP BY.
Plongez dans les questions :
Les utilisateurs ont initialement tenté de résoudre ce problème en utilisant le code suivant :
<code class="language-php">$sql = Abc::from('abc AS a') ->groupBy('col1') ->toSql(); $num = Abc::from(DB::raw($sql)) ->count(); print $num;</code>
Bien que cette approche semble logique, ce n'est pas la solution la plus efficace.
Solution élégante et optimisée :
La solution suggérée consiste à utiliser une combinaison de SQL brut et de fusion de liaisons :
<code class="language-php">$sub = Abc::where(..) ->groupBy(..); // Eloquent Builder 实例 $count = DB::table(DB::raw("({$sub->toSql()}) as sub")) ->mergeBindings($sub->getQuery()) // 以正确的顺序合并绑定 ->count();</code>
Dans cette solution, la sous-requête est construite à l'aide d'une instance d'Eloquent Builder puis incluse dans une expression SQL brute. La méthode mergeBindings()
est utilisée pour combiner les liaisons d'une sous-requête avec les liaisons de la requête principale. De cette façon, vous pouvez récupérer efficacement les données requises de la sous-requête.
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!