如何使用Laravel查询构建器从子查询中选择?
如何使用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日
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`
除了 @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();