Laravel:如何对Eloquent集合进行排序,忽略语言中的文章?

3
在laravel中,是否有一种忽略语言中的冠词(例如英语中的a,an,the;西班牙语中的el,la等)来排序集合的方法?我想要类似于jQuery Tablesorter这样的东西来对标题进行排序,但我只能找到如何使用PHP对数组进行排序,忽略开头的冠词(a,an,the)?如何在SQL中进行排序,忽略冠词('the","a',"an"等)。如果只是一个数组的话还好,但我有带分页的集合,将分页结果排序没有意义,因为它只会对有限的结果进行排序而不是整个集合。
2个回答

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");

0

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

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

此代码将在字符串开头和结尾添加空格(例如对象中的title属性或集合中的数组)。然后它将删除冠词,并且不会删除包含' an '或' the '(或其中某些其他冠词)的单词,也不会删除以冠词开头或结尾的单词。然后它将从每个字符串的开头和结尾删除空格。然后它将返回一个排序过的集合。


1
谢谢你的回答。但是排序似乎是区分大小写的,而且我知道sortBy方法是针对集合的。如果我已经有了一个包含200条记录的分页集合中的10条记录,那么它只会对当前的10条记录起作用,对吗?我在想是否可能先对所有记录进行排序,然后再进行分页。 - A.G.
@A.G. 你可以列出所有的变体,所以这里一个区分大小写的解决方案是可以的。另外,你问了关于集合的问题,我给了你一个集合的解决方案。但看起来你需要一个原始查询的解决方案。 - Alexey Mezenin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接