Laravel クエリビルダーを使用してサブクエリからデータをエレガントに選択します
最近のプロジェクトでは、Eloquent ORM を使用してデータベースからデータを取得しました。要件の 1 つは、サブクエリを使用して特定の列のレコード数をカウントすることです。実行しようとしている SQL クエリは次のとおりです:
SELECT COUNT(*) FROM (SELECT * FROM abc GROUP BY col1) AS a;
Abc モデルの from()
メソッドと groupBy()
メソッドを使用する最初の試み:
$sql = Abc::from('abc AS a')->groupBy('col1')->toSql(); $num = Abc::from(\DB::raw($sql))->count(); print $num;
しかし、あなたはより洗練されたソリューションを探しています。
完全な解決策
Laravel クエリビルダーには、FROM 句でサブクエリを作成する直接的な方法がありません。したがって、生の SQL ステートメントを手動で作成する必要があります。これを行うには、次のメソッドを使用できます:
$sub = Abc::where(...)->groupBy(...); // Eloquent Builder 实例 $count = DB::table( DB::raw("({$sub->toSql()}) as sub") ) ->mergeBindings($sub->getQuery()) // 合并所有绑定 ->count();
正確な結果を確保するには、バインディングを正しい順序でマージしてください。他のバインディング句がある場合は、mergeBindings()
の後に置く必要があります:
$count = DB::table( DB::raw("({$sub->toSql()}) as sub") ) // ->where(...) 错误的位置 ->mergeBindings($sub->getQuery()) // 合并绑定 // ->where(...) 正确的位置 ->count();
このソリューションは、複雑な条件とバインディングを含むサブクエリを実行するためのシンプルかつ効率的な方法を提供します。
以上がLaravelのクエリビルダーを使用してサブクエリからエレガントに選択する方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。