Laravel 6.0 Eloquent - 按日期和状态排序

6
尝试按最新日期和状态排序表格。状态可能是(New, In Review, Declined, Closed),并且状态是数据库中的枚举字段。
我尝试了几种方法,但都没有成功。这是我使用以下代码最接近的结果。由于我对Laravel不是很熟悉,所以不确定该如何实现此操作。
$inquiries = Inquiry::all()->sortByDesc('created_at')->sortByDesc('Status')->values();

这将产生以下内容:

--------------------------------------------------------------
|     姓名          |      创建日期      |      状态         |
--------------------------------------------------------------
|     Richard       |      05/02/2020    |       新的        |
--------------------------------------------------------------
|     James         |      05/02/2020    |       新的        |
--------------------------------------------------------------
|     Christine     |      04/16/2020    |       拒绝        |
--------------------------------------------------------------
|     Charles       |      04/14/2020    |       新的        |
--------------------------------------------------------------
|     Judy          |      03/13/2020    |       审查中      |
--------------------------------------------------------------
|     Paul          |      01/12/2020    |       新的        |
--------------------------------------------------------------

我希望它按日期排序,最新的日期排在前面,然后状态为“新”的排在前面。我希望它看起来像这样:

--------------------------------------------------------------
|     姓名          |      创建日期      |      状态         |
--------------------------------------------------------------
|     Richard       |      05/02/2020    |       新的        |
--------------------------------------------------------------
|     James         |      05/02/2020    |       新的        |
--------------------------------------------------------------
|     Charles       |      04/14/2020    |       新的        |
--------------------------------------------------------------
|     Paul          |      01/12/2020    |       新的        |
--------------------------------------------------------------
|     Christine     |      04/16/2020    |       拒绝        |
--------------------------------------------------------------
|     Judy          |      03/13/2020    |       审查中      |
--------------------------------------------------------------

你的数据库中日期是以那种格式存储的?为什么你按照 'created_at' 排序,但在表格上显示的是 'Date'? - porloscerros Ψ
所以您想首先按状态排序(更高优先级),然后按日期升序排序(使用sortByAsc而不是sortByDesc)。 - N69S
$inquiries = Inquiry::orderBy('created_at','desc')->orderBy('Status','desc')->get(); - Christophe Hubert
@porloscerrosΨ 没错,应该是“创建于”而不是“日期”。我已经编辑过了。 - Fly_Moe
好的,我本来也想建议像Christophe Hubert评论中提到的一样,也就是在数据库查询中排序,但首先按状态排序,然后再按日期排序 $inquiries = Inquiry::orderBy('Status','desc')->orderBy('created_at','desc')->get(); - porloscerros Ψ
这对我有用。谢谢大家的帮助。$inquiries = Inquiry::orderBy('status','asc')->orderBy('created_at','desc')->get(); - Fly_Moe
2个回答

11

首先让我们看看您是否需要使用orderBy()sortByDesc()

sortBy() / sortByDesc()

sortBy()sortByDesc()方法用于在从数据库获取结果后对数据进行排序。

orderBy()

orderBy方法与SQLORDER BY语句相同。这将对数据库记录进行排序,然后输出结果。


答案

在这里,你需要使用orderBy()而不是sortByDesc()这几乎是一个重复的问题,找到原始问题在这里。

// Make sure column names are correct
$inquiries = Inquiry::orderBy('status', 'ASC') // or DESC
    ->orderBy('created_at', 'DESC')
    ->get();


0

您可以将一个函数传递给集合上的sortBy函数,从而指定应该用于排序的值。这样,您还可以组合两个值进行排序。

Inquiry::all()->sortBy(function ($inquiry) {
    return sprintf('%s%s', $inquiry->created_at, $inquiry->status);      
})->values();

关于此的更多信息可以在这里阅读:https://laravel.com/docs/collections#method-sortby


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接