Laravel - 订购模型集合

我有 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


知道如何做到这一点吗?


萧十郎
浏览 155回答 2
2回答

拉莫斯之舞

您可以传递回调并检查其类的模型,返回适当的排序字段。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;});

明月笑刀无情

如果您打算仅对集合(而不是数据库级别)执行此操作,您可以考虑在每个模型上放置一个访问器,该访问器将根据模型类型返回正确的日期值。通过这种方式,您可以统一您将找到排序顺序日期的字段并简化您的代码。例如:终端型号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');
打开App,查看更多内容
随时随地看视频慕课网APP