我正在使用Eloquent(Laravel5.4)和postgreSQL数据库。我创建了一个带有name
字符串列的users
表。运行此代码将返回按名称排序的用户,但搜索区分大小写:
$users = \App\User::orderBy('name')->get();
这段代码返回如下内容:
Alix
Beatrice
Zorro
adam
bill
有没有办法使此列表不区分大小写。我想要一些类似于:
adam
Alix
Beatrice
bill
Zorro
有没有办法得到“不区分大小写的order by”结果?
我的问题是关于orderBy
和Eloquent的,而不是sortBy
和集合。
1.你为什么得到这个结果?
实际上,数据库的归类决定了字符串的比较和排序方式。
可能您当前的(表)归类是区分大小写的。在Postgres中,这个排序规则可能是C或POSIX。这意味着应用\用户::其中('name','aDaM')-
2.可能的解决办法
(1)只需将查询结果按不区分大小写的顺序(在Laravel中)
App\User::orderBy('name')->get()->sortBy('name', SORT_NATURAL|SORT_FLAG_CASE);
自Laravel 5.3以来,Eloquent的get()
返回集合。
(2)编写一个原始SQL查询,指定归类(在Laravel中),例如
DB::select('select name from users order by name COLLATE "en_US.utf8"');
此语句返回一个数组。
(3)为数据库选择另一个归类。这种解决方案将避免将来出现类似问题。
当你在开发环境中使用Laravel的迁移和种子时,最好的解决方案是
当您处于其他开发环境中时,您可以
请注意,您也可以更改正在运行的数据库上的排序规则,但要为具有(默认)排序规则设置的数据库、表、列以及索引问题做好准备。
您可以简单地执行以下操作:
$orderClause = 'UPPER('.colname.') ASC';
App\User::orderByRaw($orderClause);
SORT_NATURAL|SORT_FLAG_CASE
不遵循orderBy
它与集合上的sortBy
一起使用,不区分大小写的orderBy
不是雄辩的行为,最好直接在数据库上构建SQL查询