如何使用Laravel查询构建器从子查询中选择?

14 浏览
0 Comments

如何使用Laravel查询构建器从子查询中选择?

我想使用Eloquent ORM通过以下SQL获取值。

- SQL

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

然后我考虑了以下这个。

- Code

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

我正在寻找更好的解决方案。

请告诉我最简单的解决方案。

admin 更改状态以发布 2023年5月24日
0
0 Comments

Laravel v5.6.12 (2018-03-14) 添加了 fromSub()fromRaw() 方法到查询构建器 (#23476)

被接受的答案是正确的,但可以简化为:

DB::query()->fromSub(function ($query) {
    $query->from('abc')->groupBy('col1');
}, 'a')->count();

以上代码片段产生以下SQL:

select count(*) as aggregate from (select * from `abc` group by `col1`) as `a`

0
0 Comments

除了 @delmadord 的答案和你的评论外:

目前没有在 FROM 子句中创建子查询的方法,因此需要手动使用原始语句,然后如果需要,将合并所有绑定:

$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();

0