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

《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
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年前 评论

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