Maison >base de données >tutoriel mysql >Comment sélectionner élégamment dans une sous-requête à l'aide du générateur de requêtes de Laravel ?
Sélectionnez élégamment les données des sous-requêtes à l'aide du générateur de requêtes Laravel
Dans un projet récent, vous avez utilisé Eloquent ORM pour récupérer des données d'une base de données. L'une des exigences consiste à utiliser une sous-requête pour compter le nombre d'enregistrements dans une colonne spécifique. Voici la requête SQL que vous essayez d'exécuter :
<code class="language-sql">SELECT COUNT(*) FROM (SELECT * FROM abc GROUP BY col1) AS a;</code>
Votre première tentative d'utilisation des méthodes from()
et groupBy()
du modèle Abc :
<code class="language-php">$sql = Abc::from('abc AS a')->groupBy('col1')->toSql(); $num = Abc::from(\DB::raw($sql))->count(); print $num;</code>
Cependant, vous recherchez une solution plus élégante.
Solution complète
Le générateur de requêtes Laravel n'a aucun moyen direct de créer des sous-requêtes dans la clause FROM. Par conséquent, vous devez construire manuellement l’instruction SQL brute. Pour ce faire, vous pouvez utiliser les méthodes suivantes :
<code class="language-php">$sub = Abc::where(...)->groupBy(...); // Eloquent Builder 实例 $count = DB::table( DB::raw("({$sub->toSql()}) as sub") ) ->mergeBindings($sub->getQuery()) // 合并所有绑定 ->count();</code>
Pour garantir des résultats précis, veillez à fusionner les liaisons dans le bon ordre. Si vous avez d'autres clauses contraignantes, vous devez les mettre après mergeBindings()
:
<code class="language-php">$count = DB::table( DB::raw("({$sub->toSql()}) as sub") ) // ->where(...) 错误的位置 ->mergeBindings($sub->getQuery()) // 合并绑定 // ->where(...) 正确的位置 ->count();</code>
Cette solution fournit un moyen simple et efficace d'exécuter des sous-requêtes contenant des conditions et des liaisons complexes.
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!