orderBy对Laravel不敏感

rap*_*2-h 5 php postgresql laravel eloquent laravel-5

我正在使用Eloquent(Laravel 5.4)和一个postgreSQL数据库.我创建了一个users带有name字符串列的表.运行此代码将返回按名称排序的用户但搜索区分大小写:

$users = \App\User::orderBy('name')->get();
Run Code Online (Sandbox Code Playgroud)

此代码返回如下内容:

Alix
Beatrice
Zorro
adam
bill
Run Code Online (Sandbox Code Playgroud)

有没有办法让这个列表不区分大小写.我希望有类似的东西:

adam
Alix
Beatrice
bill
Zorro
Run Code Online (Sandbox Code Playgroud)

有没有办法获得"不区分大小写的顺序"结果?

我的问题是orderBy和Eloquent,而不是sortBy和Collections.

mjo*_*ris 11

你为什么得到这个结果?

它实际上是您的数据库的排序规则,它确定字符串的比较和排序方式.

可能您当前(表格)整理是区分大小写的.在Postgres中,这种整理可能是"C"或"POSIX".这意味着App\User::where('name', 'aDaM')->first();不会检索adam的条目并App\User::orderBy('name')->get();以区分大小写的字母顺序生成用户名.您需要不区分大小写的排序规则才能获得相反的结果.在Postgres中,这种排序规则的一个例子是en_US.UTF8(如果你的编码是UTF8).

2.可能的解决方案

(1)只需将查询结果置于不区分大小写的顺序(在Laravel中)

App\User::orderBy('name')->get()->sortBy('name', SORT_NATURAL|SORT_FLAG_CASE);
Run Code Online (Sandbox Code Playgroud)

自从Laravel 5.3以来,Eloquent's get()返回了一个Collection.

(2)例如,编写指定排序规则的原始SQL查询(在Laravel中)

DB::select('select name from users order by name COLLATE "en_US.utf8"');
Run Code Online (Sandbox Code Playgroud)

该语句返回一个数组.

(3)为数据库选择另一个排序规则.该解决方案将在未来避免类似的问题.

当您处于开发状态并使用Laravel的迁移和播种器时,最佳解决方案是

  • 删除数据库
  • 使用正确的排序规则再次创建数据库
  • 运行迁移和播种器

当你处于其他开发状态时,你可以

  • 将数据库导出到转储文件(使用create选项)
  • 通过refence将任何对旧排序规则的引用替换为转储文件中的新排序规则(文本编辑器>查找和替换)
  • 删除数据库
  • 导入转储文件

请注意,您也可以更改正在运行的数据库上的排序规则,但要为数据库以及表以及具有(默认)排序规则设置和索引问题的列做好准备.


小智 5

你可以简单地这样做:

$orderClause = 'UPPER('.colname.') ASC';
App\User::orderByRaw($orderClause);
Run Code Online (Sandbox Code Playgroud)