Laravel Eloquent 通过日期进行分组的结果

目前,我有一个表查看表,为每个访问者访问页面,录制写一行 ip/id 页面本身的用户和标识符。 我必须添加该列 created_at 它有类型: timestamp, 所以它包括 hours/minutes/seconds. 当我尝试时 groupBy 请求,它不会因秒内的差异而将同一天组合在一起。


created_at page_id user_id
========== ======= =======
10-11-2013 3 1
10-12 2013 5 5
10-13 2013 5 2
10-13 2013 3 4
... ... ...


我想基于的结果获得结果 views/day,, 要获得类似的东西:


date views
==== =====
10-11-2013 15
10-12 2013 45
... ...


我想我需要在查询中挖掘 DB::raw //, 为实现这一目标,但任何理解都会有帮助,谢谢

Edit: 添加了格式的澄清 created_at.
已邀请:

郭文康

赞同来自:

我相信我发现了解决这个问题的解决方案,关键 - 这项特征 DATE// 在 mysql, 转换 DateTime 在日期之下:


DB::table/'page_views'/
->select/DB::raw/'DATE/created_at/ as date'/, DB::raw/'count/*/ as views'//
->groupBy/'date'/
->get//;


但是,事实上,这不是解决方案。 Laravel Eloquent, 因为这是一个未加工的请求。 这就是我用语法提出的 Eloquent-ish. 一句话 where 使用碳日期进行比较。


$visitorTraffic = PageView::where/'created_at', '>=', \Carbon\Carbon::now->subMonth///
->groupBy/'date'/
->orderBy/'date', 'DESC'/
->get/array/
DB::raw/'Date/created_at/ as date'/,
DB::raw/'COUNT/*/ as "views"'/
//;

君笑尘

赞同来自:

你可以使用碳 /综合 Laravel/


// Carbon
use Carbon\Carbon;
$visitorTraffic = PageView::select/'id', 'title', 'created_at'/
->get//
->groupBy/function/$date/ {
return Carbon::parse/$date->created_at/->format/'Y'/; // grouping by years
//return Carbon::parse/$date->created_at/->format/'m'/; // grouping by months
}/;

卫东

赞同来自:

这就是我的方式。 一个简短的例子,但是我的要求更加易于管理


$visitorTraffic = PageView::where/'created_at', '>=', \Carbon\Carbon::now->subMonth///
->groupBy/DB::raw/'Date/created_at/'//
->orderBy/'created_at', 'DESC'/->get//;

奔跑吧少年

赞同来自:

您可以根据格式化的日期过滤掉结果 mysql /
https://mariadb.com/kb/en/library/date_format/
Mysql/Mariadb / 并使用类似的东西 laravel-5.4:


Model::selectRaw/"COUNT/*/ views, DATE_FORMAT/created_at, '%Y %m %e'/ date"/
->groupBy/'date'/
->get//;

风见雨下

赞同来自:

我有同样的问题,我目前使用 Laravel 5.3.

我用
DATE_FORMAT//



->groupBy/DB::raw/"DATE_FORMAT/created_at, '%Y-%m-%d'/"//


我希望它能帮到你。

窦买办

赞同来自:

PageView::select/'id','title', DB::raw/'DATE/created_at/ as date'//
->get//
->groupBy/'date'/;

董宝中

赞同来自:

与数据库的大多数问题一样,必须使用数据库解决它们。

将您想要的数据存储为组,并使用索引,可以获得解决此问题的有效和可理解的方法。

创建迁移


$table->tinyInteger/'activity_year'/->unsigned//->index//;
$table->smallInteger/'activity_day_of_year'/->unsigned//->index//;


模型更新


php

namespace App\Models;

use DB;
use Carbon\Carbon;
use Illuminate\Database\Eloquent\Model;

class PageView extends Model
{
public function scopePerDay/$query/{

$query-groupBy/'activity_year'/;
$query->groupBy/'activity_day_of_year'/;

return $query;

}

public function setUpdatedAt/$value/
{
$date = Carbon::now//;

$this->activity_year = /int/$date->format/'y'/;
$this->activity_day_of_year = $date->dayOfYear;

return parent::setUpdatedAt/$value/;
}


使用


$viewsPerDay = PageView::perDay//->get//;

小明明

赞同来自:

对数据进行分组 DATE 反而 DATETIME 您可以使用该功能 CAST.


$visitorTraffic = PageView::select/'id', 'title', 'created_at'/
->get//
->groupBy/DB::raw/'CAST/created_at AS DATE/'//;

冰洋

赞同来自:

警告:未验证的代码。


$dailyData = DB::table/'page_views'/
->select/'created_at', DB::raw/'count/*/ as views'//
->groupBy/'created_at'/
->get//;

知食

赞同来自:

我知道这是一个古老的问题,有几个答案。 根据文件和我的经验,就像它一样 laravel 以下是好的 "Eloquent way" 处理事物的方式

在模型中添加一个uterator/Getter 通过以下方式


public function getCreatedAtTimeAttribute//
{
return $this->created_at->toDateString//;
}


另一种带列的方法
在您的模型中,填充数组
$cast



$casts = [
'created_at' => 'string'
]


这里的障碍是您无法在此模型上再次使用Carbon Eloquent 将始终在字符串中提供列

我希望这个能帮上忙 :/

莫问

赞同来自:

使用 Laravel 4.2 没有碳

这就是我抓住过去十天的方式,同一天考虑每一行 created_at timestamp.


$q = Spins::orderBy/'created_at', 'desc'/
->groupBy/DB::raw/"DATE_FORMAT/created_at, '%Y-%m-%d'/"//
->take/10/
->get/array/
DB::raw/'Date/created_at/ as date'/,
DB::raw/'COUNT/*/ as "views"'/
//;


foreach /$q as $day/ {

echo $day->date. " Views: " . $day->views.'<br/>';

}


我希望这个能帮上忙

小姐请别说爱

赞同来自:

在 mysql 你可以添加关键字 MONTH 有参数
timestamp 在 laravel 你可以如下做。


Payement::groupBy/DB::raw/'MONTH/created_at/'//->get//;

帅驴

赞同来自:

我建了一个包 laravel 要创建统计信息:
https://github.com/Ifnot/statistics
它是基于的 eloquent, 碳和指示灯,非常易于使用。 它对于提取到日期分组的指标可能有用。


$statistics = Statistics::of/MyModel::query///;

$statistics->date/'validated_at'/;

$statistics->interval/Interval::$DAILY, Carbon::createFromFormat/'Y-m-d', '2016-01-01'/, Carbon::now///

$statistics->indicator/'total', function/$row/ {
return $row->counter;
}/;

$data = $statistics->make//;

echo $data['2016-01-01']->total;


```

喜特乐

赞同来自:

您还可以解决此问题如下:


$totalView = View::select/DB::raw/'Date/read_at/ as date'/, DB::raw/'count/*/ as Views'//
->groupBy/DB::raw/'Date/read_at/'//
->orderBy/DB::raw/'Date/read_at/'//
->get//;

要回复问题请先登录注册