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
Libérer: 2025-01-12 10:34:43
original
972 Les gens l'ont consulté

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>
Copier après la connexion

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>
Copier après la connexion

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>
Copier après la connexion

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>
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal