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】:

Collectionusort 等价物是 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 collectionssortBy method,在您获得数据结果后,您可以找到更多 (laravel Collection sortBy() method) & 这里是类似问题的答案https://***.com/a/28202985

【讨论】:

感谢您提供有关在关系函数之外应用此功能的信息。在你和 jedrzej 之间,你解决了我的问题,干杯!

以上是关于laravel 关系集合上的自定义排序的主要内容,如果未能解决你的问题,请参考以下文章

Android - 是不是可以使用 Comparator.comparing 而不是 API < 24 上的自定义比较器对列表进行排序?

Android:SQLite 中的自定义排序规则

相关模型 eloquent laravel 中的自定义查询

java实现多表的自定义查询。

Java 为排序构建一个特定的自定义比较器

WPF DataGrid 自定义排序,其中一些记录被锁定