Laravel多个orderBy按日分组视图

时间:2017-03-31 03:25:53

标签: laravel laravel-5 octobercms

我使用基于OctoberCMSLaravelTwig

我正在尝试使用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

返回null。

$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

2 个答案:

答案 0 :(得分:2)

我认为created_at字段是日期时间。 您的第一个查询将按日期时间排序,因此,如果存在多个匹配的created_at值,则辅助顺序将不会执行,因为它将被应用。

这应该有效:

$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

答案 1 :(得分:0)

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

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