一尘不染

按多列对Eloquent集合进行排序的语法是什么?

php

我知道使用查询生成器时,可以使用多个列进行排序

...orderBy('column1')->orderBy('column2')

但现在我正在处理集合对象。集合具有该sortBy方法,但是我无法弄清楚如何使它适用于多列。凭直觉,我最初尝试使用与相同的语法orderBy

sortBy('column1')->sortBy('column2)

但这显然只是按顺序应用排序,并且最终以column2排序,而无视column1。我试过了

sortBy('column1', 'column2')

但这会引发错误“ asort()期望参数2较长,给定字符串”。使用

sortBy('column1, column2')

不会引发错误,但是排序似乎是随机的,所以我真的不知道它的实际作用。我查看了sortBy方法的代码,但不幸的是,我很难理解它的工作方式。


阅读 239

收藏
2020-05-29

共1个答案

一尘不染

sortBy() 进行闭包,允许您提供用于比较比较的单个值,但是您可以通过将多个属性串联在一起来使其成为一个组合

$posts = $posts->sortBy(function($post) {
    return sprintf('%-12s%s', $post->column1, $post->column2);
});

如果您需要对多列进行sortBy排序,则可能需要对它们进行空格填充,以确保“ ABC”和“ DEF”紧接在“ AB”和“
DEF”之后,因此对每列填充了sprint,直到列的长度为止(至少对于最后一列除外)

请注意,如果您可以在查询中使用orderBy,这样通常效率会更高,以便在从数据库中检索时对集合进行立即排序

2020-05-29