【问题标题】:Sorting a many to many relation with Laravel Eloquent使用 Laravel Eloquent 对多对多关系进行排序
【发布时间】:2015-03-27 00:46:45
【问题描述】:

我确实有色板表、颜色表和 swatch_color 数据透视表。

关系设置为:

public function colors()
{
    return $this->belongsToMany('Color');
}

public function swatches()
{
    return $this->belongsToMany('Swatch');
}

我可以毫无问题地检索具有颜色关系的样本

$swatches = Swatch::with('colors')->get();
return dd($swatches);

Colors 始终是具有色调、R、G 和 B 属性的 5 个颜色对象的数组。

现在我想按第一个相关颜色的 R 值对色板进行排序。

【问题讨论】:

    标签: sorting laravel many-to-many eloquent relationship


    【解决方案1】:

    最佳解决方案

    $collection = collect($arr);
         $sorted = $collection->sortBy(function($vv, $kk) {
               return [$vv['isFriend'],$vv['isCoworker'],$vv['icecount']];
                });
    
     $finalArr = $sorted->values()->all();
    

    【讨论】:

      【解决方案2】:

      这就是您对$swatches 集合进行排序所需的全部内容:

      $swatches->sortBy(function ($swatch) {
        return ($color = $swatch->colors->first())
           ? $color->r
           : null;
      });
      

      另一种方法是手动joining 表格。

      您可以使用sortByDesc 进行降序排列。

      【讨论】:

      • 这个答案是正确的,它工作正常。我想出了一个解决方案,我使用 toArray() 然后对数组进行排序,但是您的解决方案要好得多。我学到的是,两者都很慢(500 个样本记录需要 11-12 秒,每个记录有 5 个关系)。所以我最终将颜色直接存储在样本模型中,这非常快。还是谢谢。
      • 是的,集合排序不是您想要对大量记录进行的操作。应该使用 DB,所以这也是我建议的方式。
      • 不用在表上添加列的同样快速的方法是缓存这个操作的结果(谷歌'laravel缓存')
      猜你喜欢
      • 1970-01-01
      • 2019-12-22
      • 2019-06-13
      • 1970-01-01
      • 2019-03-26
      • 2015-11-10
      • 2017-11-03
      • 1970-01-01
      相关资源
      最近更新 更多