为了账号安全,请及时绑定邮箱和手机立即绑定

Laravel - 订购模型集合

Laravel - 订购模型集合

PHP
萧十郎 2021-11-26 16:26:57
我有 3 个模型,我将它们组合成 1 个集合。这很好用,但我需要以某种方式按日期订购它们。就像是orderByRaw('term_date DESC')public function allRequests()    {        // Collect all request types        $requests = collect();        $terms = $this->terminations;        $deacs = $this->loadeactivations;        $reacs = $this->loareactivations;        // Use push() to collect them all in one collection        foreach ($terms as $term)            $requests->push($term);        foreach ($deacs as $deac)            $requests->push($deac);        foreach ($reacs as $reac)            $requests->push($reac);        return $requests;    }问题是每个模型都有不同的 orderby 字段名称,我需要从中订购它们。$termination需要orderbyterm_date$loareactivation需要orderbyreactivation_date $loadeactivation需要orderbydeactivation_date集合现在的方式是按模型组合在一起的顺序列出的。我试图找出一种方法来获取 3 个模型日期,将它们转换为一个日期,然后将它们排序为 DESC知道如何做到这一点吗?
查看完整描述

2 回答

?
拉莫斯之舞

TA贡献1820条经验 获得超10个赞

您可以传递回调并检查其类的模型,返回适当的排序字段。


return $requests->sortByDesc(function($model) {

    if($model instanceof \App\Terminations){

        return $model->term_date;

    } elseif($model instanceof \App\LoadedReactivation) {

        return $model->reactivation_date;

    } 


    return $model->deactivation_date;

});


查看完整回答
反对 回复 2021-11-26
?
明月笑刀无情

TA贡献1828条经验 获得超4个赞

如果您打算仅对集合(而不是数据库级别)执行此操作,您可以考虑在每个模型上放置一个访问器,该访问器将根据模型类型返回正确的日期值。

通过这种方式,您可以统一您将找到排序顺序日期的字段并简化您的代码。


例如:


终端型号


public function getSortDateAttribute()

{

   return $this->term_date;

LoaReactivation 模型


public function getSortDateAttribute()

{

   return $this->reactivation_date;

负载停用模型


public function getSortDateAttribute()

{

   return $this->deactivation_date;

然后在您的函数中,在您推送所有记录之后:


return $requests->sortByDesc('sort_order');


查看完整回答
反对 回复 2021-11-26
  • 2 回答
  • 0 关注
  • 154 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信