【问题标题】:Lumen + Eloquent 6.X join and aggregate into JSON structureLumen + Eloquent 6.X 加入并聚合成 JSON 结构
【发布时间】: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。

【问题讨论】:

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

标签: php mysql laravel eloquent lumen


【解决方案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();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-26
    • 2018-12-12
    • 2023-03-15
    • 2013-03-25
    相关资源
    最近更新 更多