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() 获取结果, 如果想分页就没办法
谢谢大家

《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
giao哥
最佳答案

优雅 啧啧啧。。

3年前 评论
讨论数量: 4

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年前
giao哥

优雅 啧啧啧。。

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年前 评论

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

3年前 评论

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