sql - 如何在 Laravel Eloquent 中使用 withCount 和 groupBy month?

标签 sql laravel eloquent

我正在尝试计算每个月的博客数量以及一次查询中每个博客的帖子数量:

Blog::withCount(['posts'])
    ->whereBetween('created_at', $this->currentRange())
    ->select(DB::raw("DATE_FORMAT(created_at, '%b') month"), DB::raw('COUNT(*) num'), DB::raw('SUM(posts_count) sum'))
    ->groupBy('month')
    ->get();

得到如下结果:

+---------+-------+--------+
|  month  |  num  | posts  |
+---------+-------+--------+
| Jan     |  10   | 5      |
| Feb     |  20   | 6      |
| Mar     |  30   | 7      |
+---------+-------+--------+

以下SQL由eloquent生成:

SELECT
  DATE_FORMAT(created_at, '%b') MONTH,
  COUNT(*) num,
  SUM(posts_count) sum
FROM
  `blogs`
WHERE
  `created_at` BETWEEN 0001 -01 -01 00: 00: 00
  AND 2023 -01 -05 21: 10: 59
  AND `blogs`.`deleted_at` IS NULL
GROUP BY
  `MONTH`

完全缺少 posts_count。我想我期待 Eloquent 魔法。有没有一种 Eloquent 方式来做到这一点?还是原始查询是前往此处的方式?

最佳答案

您可以使用子查询。

Blog::withCount(['posts'])
    ->select(DB::raw("DATE_FORMAT(blogs.created_at, '%b') month"), DB::raw('COUNT(*) num'), DB::raw("SUM(posts_count) sum"))
    ->join(DB::raw("(SELECT blog_id, SUM(posts.id) sum_posts FROM posts WHERE posts.created_at BETWEEN blogs.created_at AND blogs.created_at + INTERVAL 1 MONTH GROUP BY blog_id) as posts_per_blog"), function($join) {
        $join->on('blogs.id', '=', 'posts_per_blog.blog_id');
    })
    ->whereBetween('blogs.created_at', $this->currentRange())
    ->groupBy('month')
    ->get();

关于sql - 如何在 Laravel Eloquent 中使用 withCount 和 groupBy month?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75023938/

相关文章:

sql - PostgreSQL 错误 : function to_tsvector(character varying, 未知)不存在

SQL 查询 - 从 CASE 计算新定义的值

SQL - ROW_NUMBER () OVER (ORDER BY) 不起作用

php - 在 laravel 5.3 中按查询分组

php - 基于 Eloquent 模型创建后代类

mysql - 在我们更新 Mysql 版本时需要使用 @ 更改 MYSQL 查询

php - 如何使用原始查询在 laravel 5 中使用分页

php - 我想用 Eloquent laravel 5 将人们添加到组中

php - Laravel 跟踪通知

Laravel eloquent api 资源移除 `data` key(无集合)