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 ?

Comment sélectionner élégamment dans une sous-requête à l'aide du générateur de requêtes de Laravel ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2025-01-12 10:34:43973parcourir

How to Elegantly Select from a Subquery using Laravel's Query Builder?

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn