Laravel:如何排序雄辩的集合忽略语言的文章?

时间:2017-12-20 10:21:25

标签: laravel sorting collections eloquent

在laravel中,有没有办法对集合进行排序,忽略语言中的文章(例如a,an,in English; el,la in Spanish; etc。)?

我希望标题为jQuery Tablesorter,但我只能找到

How to sort an array with PHP, ignoring the articles (a, an, the) in the beginning?

How to sort in SQL, ignoring articles ('the", "a', "an" etc)

如果它是一个数组,那很好,但我有分页的集合,对分页结果进行排序是没有意义的,因为它只会对有限的结果进行排序而不是整个集合。

2 个答案:

答案 0 :(得分:1)

@Alexey的答案确实解决了问题,如果你没有分页集合,因为我有分页,我通过使用orderByRaw()方法和正则表达式大小写匹配来解决问题。希望这可以帮助处于类似情况的人。

$query->orderByRaw("CASE
                        WHEN title REGEXP '^("a|an|the|el|la")[[:space:]]' = 1 THEN
                            TRIM(SUBSTR(title, INSTR(title, ' ')))
                        ELSE title
                    END ASC");

答案 1 :(得分:0)

您可以将闭包传递给sortBy()sortByDesc()方法:

$collection->sortBy(function ($i) {
    return trim(str_replace([' a ', ' an ', ' the ', ' el '], '', ' ' . $i['title'] . ' '));
});

此代码将在字符串的开头和结尾添加空格(即对象中的title属性或集合中的数组)。然后它将删除文章,不会删除有''或者'' (或其中的一些其他文章)或以文章开头或结尾。然后它将从每个字符串的开头和结尾删除空格。然后它将返回一个已排序的集合。