Lumen + Eloquent 6.X 加入并聚合成 JSON 结构

Posted

技术标签:

【中文标题】Lumen + Eloquent 6.X 加入并聚合成 JSON 结构【英文标题】:Lumen + Eloquent 6.X join and aggregate into JSON structure 【发布时间】:2020-07-02 03:30:30 【问题描述】:

考虑两个表 lectorslessons 及其 Eloquent 模型 LectorLessonLectors表格内容:

| id | name | 
| 1  | John |
| 2  | Jack |

Lessons表格内容:

| id | state | lector_id |
| 1  | new   | 1         |
| 2  | new   | 1         |
| 3  | old   | 1         |
| 4  | new   | 2         |

我想查询数据库以获取每个讲师的新课程数量和旧课程数量。 示例数据库输出是

| id | name | count_new | count_old |
| 1  | John | 2         | 1         |
| 2  | Jack | 1         | 0         |

我对现阶段的查询并不特别关注。我希望我的 API 返回如下 JSON 结果。这就是我正在努力使用 Lumen/Eloquent 做的事情。

[
  
    "id": 1,
    "name": "John",
    "count_new": 2,
    "count_old": 1
  ,
  
    "id": 2,
    "name": "Jack",
    "count_new": 1,
    "count_old": 0
  
]

我对避免单独查询表然后循环代码中的内容的一般方法感兴趣,正如我在互联网上看到的那样。这似乎是错误的。是否可以使用 Eloquent 中可用的 API 来做到这一点?在文档中没有找到太多帮助。我得到的最接近的是subJoins。

【问题讨论】:

你看laravel.com/docs/eloquent-relationships#counting-related-models了吗? 你有什么尝试吗?展示你的作品。 @miken32 我确实尝试了 subJoins,它一直有效,直到我添加第二个聚合 .. 然后它乘以 json 数组中的结果数。普通连接创建了一个平面结构,其中讲师重复。这是一个提出一般问题的简单案例。我还有更复杂的查询,我想将客户端数组与聚合一起添加到每个讲师 @JonasStaudenmeir 我上个月来回阅读文档,但错过了这一部分!看起来很有希望,我会试一试,谢谢! @JonasStaudenmeir 非常感谢!它完美地工作......结果查询不是我能想象的最好的,但它只是一个查询,代码非常好。请发表您的评论作为答案,我会接受它 【参考方案1】:

答案在文档中:https://laravel.com/docs/eloquent-relationships#counting-related-models

$result = Lector::withCount([
            'lessons as lessonsnew_count' => function (Builder $query) 
                $query->where('state', '=', 'new');
            ,
            'lessons as lessons_old_count' => function (Builder $query) 
                $query->where('state', '=', 'old');
            ])->get();

【讨论】:

以上是关于Lumen + Eloquent 6.X 加入并聚合成 JSON 结构的主要内容,如果未能解决你的问题,请参考以下文章

Lumen (Laravel) Eloquent php artisan make:model 未定义

Lumen/Laravel Eloquent - 按数据透视表中的属性过滤

在多个文件中拆分 Lumen 6.X 路由

在 Laravel(流明)上使用 Mockery 模拟 Eloquent 模型不起作用

Lumen Repository

如何在 LUMEN 中使用 GATE 立面(Laravel 6.2)