Laravel Eloquent:对行进行计数并按天分组

时间:2018-07-18 12:30:15

标签: laravel group-by eloquent php-carbon

我有一个名为“ AdInteraction”的模型,这些交互可以是clickview(它们将boolean clicked或boolean viewed设置为true )。

我每次互动都保存了created_at日期。

现在这就是我要得到的最终结果,以便拥有填充ChartJS图表所需的所有数据:

[
    {
        "date": "01-01-2018"
        "clicks": 13,
        "views": 25
    },
    {
        "date": "02-01-2018"
        "clicks": 25,
        "views": 74
    },
    {
        "date": "03-01-2018"
        "clicks": 0,
        "views": 0
    },
]

这是我已经在与Ad相关的AdInteraction模型上得到的查询:

public function getClicksForLastDays()
{
    return $this->clicks()->get()->groupBy(function($date) {
        return Carbon::parse($date->created_at)->format('y-m-d');
    });
}

但是这将返回一个数组,如下所示:

enter image description here

获取点击并按天数计数的正确,最有效的方法是什么?

2 个答案:

答案 0 :(得分:1)

尝试一下,让我知道,我假设您的列名称为date,clicks,views,如果它的名称不同,则请让我知道,所以我将调整答案,或者您可以自己完成。.

  AdInteraction::select([DB::raw('DATE(date)'),DB::raw('count(case when clicks ="true" then 1 end) as "Clicks"'),
DB::raw('count(case when views ="true" then 1 end) as "Views"')])
->groupBy(DB::raw('DATE(date)'))
->get();

或尝试

 AdInteraction::select([DB::raw('DATE(date)'),DB::raw('count(case when clicks =true then 1 end) as "Clicks"'),
        DB::raw('count(case when views =true then 1 end) as "Views"')])
        ->groupBy(DB::raw('DATE(date)'))
        ->get();

答案 1 :(得分:0)

您应该考虑放弃使用datetime列按GROUP BY DATE(created_at)进行分组的想法,因为这种查询的效率非常低。例如,当您使用created_at时,MySQL将为每一行执行此强制转换功能,并且将无法使用DATE created_date_at的索引。

因此,我建议您通过为created_at值引入单独的AdInteraction::creating(function ($adInteraction) { $adInteraction->created_date_at = $adInteraction->created_at->format('Y-m-d'); }); 列并为其创建索引来对表进行非规范化。然后,您将可以通过此新列值将统计信息有效地分组。只要确保为您的模型注册以下代码即可:

int

或者您可以考虑为年,月和日分别创建version: '3' services: postgres: build: . environment: POSTGRES_PASSWORD: qwerty123456 POSTGRES_USER: postgres #POSTGRES_DB: sample_db volumes: - ./pgdata:/var/lib/postgresql/data/ ports: - "5433:5432" healthcheck: test: exit 0 Dockerfile: FROM postgres:alpine ADD ./init.sql /docker-entrypoint-initdb.d/ init.sql: create database db_sample; drop table if exists tbl_sample; create table tbl_sample(s_id serial primary key,samp_name varchar(255)) 列。然后,您可以创建一个多列索引并按这些列分组。这样,如果需要,您还可以按天,月和年轻松获取统计信息。