【问题标题】:Laravel - Ordering a collection of modelsLaravel - 订购模型集合
【发布时间】:2019-08-16 20:11:31
【问题描述】:

我有 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 需要订购by term_date
$loareactivation 需要订购by reactivation_date $loadeactivation需要订购by deactivation_date

现在集合的方式是按模型分组在一起的顺序列出的。

我正在尝试找出一种方法来获取 3 个模型日期,将它们放入一个日期,然后将它们订购 DESC

知道如何做到这一点吗?

【问题讨论】:

    标签: php laravel collections


    【解决方案1】:

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

    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;
    });
    

    【讨论】:

    • 这正是我一直在寻找的......我只需要稍微调整你的答案以满足我的需要。谢谢!
    【解决方案2】:

    如果您打算仅对集合(而不是数据库级别)执行此操作,则可以考虑在每个模型上放置一个访问器,该访问器将根据模型类型返回正确的日期值。
    通过这种方式,您可以统一用于查找排序日期的字段并简化代码。

    例如:

    终止模型

    public function getSortDateAttribute()
    {
       return $this->term_date;
    } 
    

    LoaReactivation 模型

    public function getSortDateAttribute()
    {
       return $this->reactivation_date;
    } 
    

    LoaDeactivation 模型

    public function getSortDateAttribute()
    {
       return $this->deactivation_date;
    } 
    

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-11-25
      • 2012-06-16
      • 1970-01-01
      • 2020-09-08
      • 1970-01-01
      • 2022-01-21
      • 2020-09-08
      • 1970-01-01
      相关资源
      最近更新 更多