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的常见查询方法