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

Posted

技术标签:

【中文标题】Laravel 6.0 Eloquent - 按日期和状态排序【英文标题】:Laravel 6.0 Eloquent - sort by date and status 【发布时间】:2020-08-17 03:32:57 【问题描述】:

尝试首先按最新日期订购我的桌子,然后是状态。 Status 可以是(New、In Review、Declined、Closed),Status 是数据库中的一个枚举字段。

我已经尝试了几件事,但都没有成功。这是我与此代码最接近的。我是 Laravel 新手,所以不知道该怎么做。

$inquiries = Inquiry::all()->sortByDesc('created_at')->sortByDesc('Status')->values();

产生这个:

-------------------------------------------------- ------------ |姓名 |创建于 |状态 | -------------------------------------------------- ------------ |理查德 | 2020 年 5 月 2 日 |新 | -------------------------------------------------- ------------ |詹姆斯 | 2020 年 5 月 2 日 |新 | -------------------------------------------------- ------------ |克里斯汀 | 2020 年 4 月 16 日 |拒绝 | -------------------------------------------------- ------------ |查尔斯 | 2020 年 4 月 14 日 |新 | -------------------------------------------------- ------------ |朱迪 | 2020 年 3 月 13 日 |回顾 | -------------------------------------------------- ------------ |保罗 | 2020 年 1 月 12 日 |新 | -------------------------------------------------- ------------

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

-------------------------------------------------- ------------ |姓名 |创建于 |状态 | -------------------------------------------------- ------------ |理查德 | 2020 年 5 月 2 日 |新 | -------------------------------------------------- ------------ |詹姆斯 | 2020 年 5 月 2 日 |新 | -------------------------------------------------- ------------ |查尔斯 | 2020 年 4 月 14 日 |新 | -------------------------------------------------- ------------ |保罗 | 2020 年 1 月 12 日 |新 | -------------------------------------------------- ------------ |克里斯汀 | 2020 年 4 月 16 日 |拒绝 | -------------------------------------------------- ------------ |朱迪 | 2020 年 3 月 13 日 |回顾 | -------------------------------------------------- ------------

【问题讨论】:

您的数据库中是否有该格式的日期?为什么您按“created_at”排序,但在该表上显示“日期”? 所以您想先按状态排序(优先级更高),然后按日期 ASC 排序(使用 sortByAsc 而不是 sortByDesc) $inquiries = Inquiry::orderBy('created_at','desc')->orderBy('Status','desc')->get(); @porloscerrosΨ 正确,日期应该是“创建时间”而不是“日期”。我编辑了它。 好的,我的建议与 Christophe Hubert 的评论几乎相同,换句话说,在数据库查询中排序,但先按状态排序,然后按日期排序$inquiries = Inquiry::orderBy('Status','desc')->orderBy('created_at','desc')->get(); 【参考方案1】:

首先让我们看看你需要使用orderBy()还是sortByDesc()

sortBy() / sortByDesc()

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

orderBy()

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


回答

这里你需要使用orderBy() 而不是sortByDesc()。 It's almost a duplicate question, Find the original here.

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

【讨论】:

【参考方案2】:

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

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

您可以在此处阅读更多信息:https://laravel.com/docs/collections#method-sortby

【讨论】:

以上是关于Laravel 6.0 Eloquent - 按日期和状态排序的主要内容,如果未能解决你的问题,请参考以下文章

php Laravel 5 Eloquent CheatSheet #laravel #eloquent

php Laravel 5 Eloquent CheatSheet #laravel #eloquent

php [Eloquent CheatSheet] Eloquent #laravel #eloquent的常见查询方法

Laravel - Eloquent 连接

Laravel 从 Raw DB 到 Eloquent

Laravel/Eloquent 建议覆盖 trait 属性?