2015-08-13 48 views
6

我有点卡在通常非常简单的事情上。我需要根据hasMany关系将记录排序为基于某个值和“排序顺序”数组的自定义顺序。laravel关系集合上的自定义排序

我下面的代码不起作用,因为我通过uSort()一个雄辩的集合,我不知道如何解决它。

$go = $this->hasMany('Product')->orderBy('colour','DESC'); 

$order = array('RED', 'GREEN', 'BLUE', 'YELLOW'); 

usort($go, function ($a, $b) use ($order) { 
    $pos_a = array_search($a->colour, $order); 
    $pos_b = array_search($b->colour, $order); 
    return $pos_a - $pos_b; 
}); 

return $go; 

也许我失去了一些令人惊异的魔法laravel帮手,但我坚持。任何想法或建议将不胜感激!

干杯

+0

能否请您发布过类似的问题的答案'$ go'的数组结构与'print_r($ go)'一起,以及期望的输出 –

回答

5

usort等效为收集排序()方法。它将回调作为参数并返回排序后的集合。

所以你的情况,解决办法是:

$go = $go->sort(function ($a, $b) use ($order) { 
    $pos_a = array_search($a->colour, $order); 
    $pos_b = array_search($b->colour, $order); 
    return $pos_a - $pos_b; 
}); 
+0

这是在将它移到关系定义之外后才起作用的,因为关系函数必须返回关系。感谢这个伟大的例子! –

1

你得到的结果只有在这里边$go = $this->hasMany('Product')->orderBy('colour','DESC');您是刚开始的一类将返回可以返回的实例你的排序将被应用你的结果,如果你申请一个get方法就可以了。

你的目的,你有你得到的数据结果后使用sortBy methodlaravel collections你可以找到更多的(laravel Collection sortBy() method) &这里是你https://stackoverflow.com/a/28202985

+0

感谢有关在关系函数外部应用此信息。在你和jedrzej之间,你已经解决了我的问题,欢呼! –