1. ホーム
  2. sql

[解決済み] Laravelクエリビルダを使用してサブクエリから選択するには?

2022-08-03 15:34:52

質問

Eloquent ORMを使って、以下のようなSQLで値を取得したいです。

- SQL

 SELECT COUNT(*) FROM 
 (SELECT * FROM abc GROUP BY col1) AS a;

そこで、次のように考えてみました。

- コード

 $sql = Abc::from('abc AS a')->groupBy('col1')->toSql();
 $num = Abc::from(\DB::raw($sql))->count();
 print $num;

より良い解決策を探しています。

最もシンプルな解決策を教えてください。

どのように解決するのですか?

delmadordさんの回答や皆さんのコメントに加え。

現在のところ、サブクエリを FROM 節にサブクエリを作成する方法はありませんので、手動で raw ステートメントを使用し、その後、必要に応じてすべてのバインディングをマージする必要があります。

$sub = Abc::where(..)->groupBy(..); // Eloquent Builder instance

$count = DB::table( DB::raw("({$sub->toSql()}) as sub") )
    ->mergeBindings($sub->getQuery()) // you need to get underlying Query Builder
    ->count();

に注意してください。 バインディングを正しい順序でマージする . もし他の結合節がある場合は、それらを mergeBindings :

$count = DB::table( DB::raw("({$sub->toSql()}) as sub") )

    // ->where(..) wrong

    ->mergeBindings($sub->getQuery()) // you need to get underlying Query Builder

    // ->where(..) correct

    ->count();