Laravel雄辩:数数行数并按天分组

Laravel雄辩:数数行数并按天分组,laravel,group-by,eloquent,php-carbon,Laravel,Group By,Eloquent,Php Carbon,我有一个名为“AdInteraction”的模型,这些交互可以是点击或查看(它们可以是布尔点击或布尔查看设置为true) 在每次交互中,我都会保存在日期创建的 现在,为了获得填充ChartJS图表所需的所有数据,我希望最终得到以下内容: [ { "date": "01-01-2018" "clicks": 13, "views": 25 }, { "date": "02-01-2018" "c

我有一个名为“AdInteraction”的模型,这些交互可以是
点击
查看
(它们可以是布尔
点击
或布尔
查看
设置为true)

在每次交互中,我都会保存在日期创建的

现在,为了获得填充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');
    });
}
但是,这会返回一个数组,如下所示:


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

试试这个,让我知道,我假设你的列名是
日期、点击、视图
,如果不同,请让我知道,所以我会调整答案,或者你可以自己做

  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();

试试这个,让我知道,我假设你的列名是
日期、点击次数、视图
,如果不同,请让我知道,所以我会调整答案,或者你可以自己做

  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();
您应该考虑使用<代码>日期>代码>放弃分组的想法,使用<代码> DATETIME>/代码>列,因为这样的查询将非常低效。例如,
按日期分组(在创建时)
MySQL将为每一行执行此强制转换功能,并且将无法为
在创建时使用索引

因此,我建议您通过为
created\u at
值引入单独的
datecreated\u DATE\u at
列来取消表的规范化,并为其创建索引。然后,您将能够通过这个新列值有效地分组您的统计数据。请确保为您的型号注册以下代码:

AdInteraction::创建(函数($AdInteraction){
$adInteraction->created_date_at=$adInteraction->created_at->format('Y-m-d');
});

或您可以考虑创建单独的<代码> int >代码>年、月、日列。然后可以创建多列索引并按这些列分组。这样,如果需要,您还可以轻松地按天数、月份和年份检索统计数据。

您应该考虑使用<代码>日期>代码>放弃分组的想法,使用<代码> DATETIME>/代码>列,因为这样的查询将非常低效。例如,
按日期分组(在创建时)
MySQL将为每一行执行此强制转换功能,并且将无法为
在创建时使用索引

因此,我建议您通过为
created\u at
值引入单独的
datecreated\u DATE\u at
列来取消表的规范化,并为其创建索引。然后,您将能够通过这个新列值有效地分组您的统计数据。请确保为您的型号注册以下代码:

AdInteraction::创建(函数($AdInteraction){
$adInteraction->created_date_at=$adInteraction->created_at->format('Y-m-d');
});

或您可以考虑创建单独的<代码> int >代码>年、月、日列。然后可以创建多列索引并按这些列分组。这样,如果需要,您还可以轻松地按天、月和年检索统计数据。

您可能希望按
DATE(DATE)
分组,因为
DATE
似乎是一个datetime。否则,看起来不错(至少对于某些SQL类型而言)。谢谢!我对它进行了如下调整:,这给了我一些如下的数组:。这里唯一的问题是,分组时需要考虑时间。但是我想按天、月、年分组,忽略时间。我还想让它显示过去30天,即使没有点击或视图,它也应该生成一个数组,其中日期和
点击次数设置为0。你知道我怎么做吗?是的,你是对的,如果是datetime列,那么他必须使用
->groupBy(DB::raw('DATE(DATE)'))
,但是他在问题中提到了日期类型。是的,你可以显示30天,因为你需要一个包含一个月中所有天的数据库表,因此,你可以写一份老太婆的工作来填补这一整年的空缺,并按照我的教程(另一个场景)说明如何根据你的情况进行调整,如果你需要进一步的帮助,请在我的博客中写信给我,我会回答你。。regardsAlright现在明白了。我需要在SQL查询中使用sum()而不是count()。现在工作完美了!您可能希望按
DATE(DATE)
分组,因为
DATE
似乎是一个datetime。否则,看起来不错(至少对于某些SQL类型而言)。谢谢!我对它进行了如下调整:,这给了我一些如下的数组:。这里唯一的问题是,分组时需要考虑时间。但是我想按天、月、年分组,忽略时间。我还想让它显示过去30天,即使没有点击或视图,它也应该生成一个数组,其中日期和
点击次数设置为0。你知道我怎么做吗?是的,你是对的,如果是datetime列,那么他必须使用
->groupBy(DB::raw('DATE(DATE)'))
,但是他在问题中提到了日期类型。是的,你可以显示30天,因为你需要一个包含一个月中所有天的数据库表,因此,你可以写一份老太婆的工作来填补这一整年的空缺,并按照我的教程(另一个场景)说明如何根据你的情况进行调整,如果你需要进一步的帮助,请在我的博客中写信给我,我会回答你。。regardsAlright现在明白了。我需要在SQL查询中使用sum()而不是count()。现在工作完美了!使用
date
作为列名不是一个好主意,因为它是一个(可能是其他所有SQL类型)。date不是列名,只是我为数组值选择的名称。列名是在
@NamoshekSure创建的。对不起,我应该再次查看输出的图片。使用
日期
作为列名称