laravel 关系集合上的自定义排序
Posted
技术标签:
【中文标题】laravel 关系集合上的自定义排序【英文标题】:Custom sorting on a laravel relationship collection 【发布时间】:2015-08-13 08:32:31 【问题描述】:我有点卡在通常很直截了当的事情上。我需要根据某个值和“排序顺序”数组将 hasMany 关系中的记录排序为自定义顺序。
我下面的代码不起作用,因为我正在向 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 魔法助手,但我被卡住了。任何想法或建议将不胜感激!
干杯
【问题讨论】:
你能把$go
的数组结构和预期的输出一起发布为print_r($go)
吗
【参考方案1】:
Collection 的 usort 等价物是 sort() 方法。它将回调作为参数并返回排序后的集合。
所以在你的情况下,解决方案是:
$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;
);
【讨论】:
这在将其移到关系定义之外后起作用了,因为关系函数必须返回一个关系。谢谢你的好例子!【参考方案2】:只有在您获得结果后才会应用您的排序,而这里 $go = $this->hasMany('Product')->orderBy('colour','DESC');
您只是获得一个将返回的类的实例,如果您应用 @,则可以返回您的结果987654324@方法就可以了。
为了您的目的,您必须使用 laravel collections
的 sortBy method
,在您获得数据结果后,您可以找到更多 (laravel Collection sortBy() method) & 这里是类似问题的答案https://***.com/a/28202985
【讨论】:
感谢您提供有关在关系函数之外应用此功能的信息。在你和 jedrzej 之间,你解决了我的问题,干杯!以上是关于laravel 关系集合上的自定义排序的主要内容,如果未能解决你的问题,请参考以下文章
Android - 是不是可以使用 Comparator.comparing 而不是 API < 24 上的自定义比较器对列表进行排序?