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 【问题描述】:考虑两个表 lectors
、lessons
及其 Eloquent 模型 Lector
和 Lesson
。
Lectors
表格内容:
| 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 来做到这一点?在文档中没有找到太多帮助。我得到的最接近的是subJoin
s。
【问题讨论】:
你看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 - 按数据透视表中的属性过滤