提问者:小点点

orderBy与Laravel不区分大小写


我正在使用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和集合。


共3个答案

匿名用户

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查询