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的迁移和播种器时,最佳解决方案是
当你处于其他开发状态时,你可以
请注意,您也可以更改正在运行的数据库上的排序规则,但要为数据库以及表以及具有(默认)排序规则设置和索引问题的列做好准备.
小智 5
你可以简单地这样做:
$orderClause = 'UPPER('.colname.') ASC';
App\User::orderByRaw($orderClause);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2661 次 |
| 最近记录: |