Laravel 多订单按天分组查看

Posted

技术标签:

【中文标题】Laravel 多订单按天分组查看【英文标题】:Laravel Multiple orderBy Group Views by Day 【发布时间】:2017-08-25 04:57:47 【问题描述】:

我正在使用基于Laravel 和Twig 的OctoberCMS。

我正在尝试使用 orderBy 对数据库中的图像列表进行排序。

我需要显示按日期 (desc) 分组​​的图像,然后按该日期内的视图 (desc) 排序。

我阅读了here 以使用多个orderBy 通行证。

数据库记录

name     | created_at          | views
---------------------------------------
image 01 | 2017-03-27 07:08:31 | 3
image 02 | 2017-03-27 01:19:44 | 25
image 03 | 2017-03-25 01:43:06 | 9
image 04 | 2017-03-25 04:19:43 | 1
image 05 | 2017-03-25 15:19:43 | 12
image 06 | 2017-03-22 03:07:06 | 4
image 07 | 2017-03-22 08:10:07 | 16
image 08 | 2017-03-21 09:04:29 | 39
image 09 | 2017-03-20 07:38:31 | 5
image 10 | 2017-03-20 05:32:24 | 28

Laravel

orderBy

按日期created_at 成功排序,但忽略按视图排序。可能是因为time

$this->page["scopeGallery"] = Gallery::orderBy('created_at', 'desc')
                                      ->orderBy('views', 'desc')
                                      ->get();

groupBy

返回空值。

$this->page["scopeGallery"] = Gallery::select(\DB::raw('DATE(created_at) as day'))
                                      ->groupBy('day')
                                      ->orderBy('views', 'desc')
                                      ->get();

树枝

% for image in this.page.scopeGallery %
    image.name
% endfor %

我正在寻找的结果

name     | created_at | views
------------------------------
image 02 | 2017-03-27 | 25
image 01 | 2017-03-27 | 3

image 05 | 2017-03-25 | 12
image 03 | 2017-03-25 | 9
image 04 | 2017-03-25 | 1

image 07 | 2017-03-22 | 16
image 06 | 2017-03-22 | 4

image 08 | 2017-03-21 | 39

image 10 | 2017-03-20 | 28
image 09 | 2017-03-20 | 5

【问题讨论】:

【参考方案1】:

我认为created_at 字段是日期时间。 您的第一个查询将按日期时间排序,因此如果有多个 created_at 值匹配,则二级 orderby 不会做太多事情。

这应该可行:

$this->page["scopeGallery"] = Gallery::orderByRaw(\DB::raw('DATE(created_at) desc'))
                                  ->orderBy('views', 'desc')
                                  ->get();

这将创建以下查询:

select * from `your_table` order by DATE(created_at) desc, `views` desc

【讨论】:

我发布了一个答案。我不得不使用select 并在没有时间的情况下按天订购。但是你认为'(created_at) as day' 会在下个月搞砸并将两个月的匹配天组合在一起吗? 可能是的,因为它将按天数排序。所以 1 月 2 日将在 2 月 1 日之后。 我怎样才能将月份和日期组合成单独的组? 你想达到什么目的? 我需要对图库进行结构化,以便图像按天分组,然后按当天的浏览量排序。【参考方案2】:

我必须这样做,并在select 中包含我需要的任何其他列。

$this->page["scopeGallery"] = Gallery::select([
                                        'name',
                                        \DB::raw('DATE(created_at) as day')
                                      ])
                                      ->orderBy('day', 'desc')
                                      ->orderBy('views', 'desc')
                                      ->get();

【讨论】:

以上是关于Laravel 多订单按天分组查看的主要内容,如果未能解决你的问题,请参考以下文章

Laravel Eloquent按天分组结果

Laravel 选择列,然后按日期对列值进行分组

Laravel如何根据查询按天渲染成融合图表

如何在 Laravel 中按日期排序消息

Laravel 查询生成器按天计算行数 SQL db::raw

如何在laravel中从多对多关系中检索多个记录