ホームページ >データベース >mysql チュートリアル >Laravelのクエリビルダーを使用してサブクエリからエレガントに選択する方法は?

Laravelのクエリビルダーを使用してサブクエリからエレガントに選択する方法は?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2025-01-12 10:34:43930ブラウズ

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

Laravel クエリビルダーを使用してサブクエリからデータをエレガントに選択します

最近のプロジェクトでは、Eloquent ORM を使用してデータベースからデータを取得しました。要件の 1 つは、サブクエリを使用して特定の列のレコード数をカウントすることです。実行しようとしている SQL クエリは次のとおりです:

<code class="language-sql">SELECT COUNT(*) FROM 
(SELECT * FROM abc GROUP BY col1) AS a;</code>

Abc モデルの from() メソッドと groupBy() メソッドを使用する最初の試み:

<code class="language-php">$sql = Abc::from('abc AS a')->groupBy('col1')->toSql();
$num = Abc::from(\DB::raw($sql))->count();
print $num;</code>

しかし、あなたはより洗練されたソリューションを探しています。

完全な解決策

Laravel クエリビルダーには、FROM 句でサブクエリを作成する直接的な方法がありません。したがって、生の SQL ステートメントを手動で作成する必要があります。これを行うには、次のメソッドを使用できます:

<code class="language-php">$sub = Abc::where(...)->groupBy(...); // Eloquent Builder 实例

$count = DB::table( DB::raw("({$sub->toSql()}) as sub") )
    ->mergeBindings($sub->getQuery()) // 合并所有绑定
    ->count();</code>

正確な結果を確保するには、バインディングを正しい順序でマージしてください。他のバインディング句がある場合は、mergeBindings() の後に置く必要があります:

<code class="language-php">$count = DB::table( DB::raw("({$sub->toSql()}) as sub") )

    // ->where(...) 错误的位置

    ->mergeBindings($sub->getQuery()) // 合并绑定

    // ->where(...) 正确的位置

    ->count();</code>

このソリューションは、複雑な条件とバインディングを含むサブクエリを実行するためのシンプルかつ効率的な方法を提供します。

以上がLaravelのクエリビルダーを使用してサブクエリからエレガントに選択する方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。