Eloquent 如何能优雅的写出多个 aggregate 查询

laravel.io/forum/06-17-2014-multip...
SELECT Count(*), Min(some_field), Max(some_field) FROM some_table
比如上述这个 sql, 是一条带有聚合的查询
若想通过 eloquent 实现, 似乎只能通过把聚合函数写进 selectRaw() 里面来实现
想请教下有没有更优雅的实现方式
我查看过 query builder 的源码, 确实有一个方法是干这个的 setAggregate()
但是这个方法是 protected 的, 外部没法调用
继续查就查到 aggregate() 这个方法会调用他
但是这个方法会调用 get() 获取结果, 如果想分页就没办法
谢谢大家

《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
giao哥
最佳答案

优雅 啧啧啧。。

3年前 评论
讨论数量: 4

reinink.ca/articles/dynamic-relati... 可以看下这篇文章 addSelect+selectRaw

3年前 评论

1.如果SQL跟你举例的一样只是简单的聚合查询,就用 selectRaw 就可以解决了,更优雅的方式我也不知道了(不要为了优雅而优雅)

  1. 如果涉及复杂的子查询,倒是有个优雅点的操作:
    Model::query()->selectSub(function (\Illuminate\Database\Query\Builder $builder) {
     $builder->from('table_name')->selectRaw('max(score)')}, 'max_score')->get();

生成的sql大概是这样的:

 select (select max(score) from `table_name `) as `max_score ` from `model`

需要注意的是 selectSub 里的子句必须使用 select ,否则会报错,并且只有 select 的第一个字段会生效

3年前 评论
hldh214 (楼主) 3年前

还可以在在select里面写DB::raw() :see_no_evil: :see_no_evil:

Order::where($wheres)
                ->whereBetween("days", $times)
                ->whereIn("order_type", [3, 4, 5])
                ->select([
                    DB::raw("if(find_in_set(order_type,'2,3,4') && is_refund = 1,sum(pay_money),0) as over_price_all"),
                    DB::raw("if(find_in_set(order_type,'2,3,4') && is_refund = 1,sum(terrace_money),0) as terrace_money_all"),
                    "days",
                ])
                ->get();
3年前 评论
giao哥

优雅 啧啧啧。。

3年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!