我使用Eloquent(Laravel 5.4)和postgreSQL数据库。我创建了一个users
表,其中包含name
字符串列。运行此代码将返回按名称排序的用户但搜索区分大小写:
$users = \App\User::orderBy('name')->get();
此代码返回如下内容:
Alix
Beatrice
Zorro
adam
bill
有没有办法让这个列表不区分大小写。我希望有类似的东西:
adam
Alix
Beatrice
bill
Zorro
有没有办法通过"来获得"不区分大小写的顺序?结果?
我的问题是关于orderBy
和Eloquent,而不是sortBy
和收藏。
答案 0 :(得分:11)
<强> 1。你为什么得到这个结果?
实际上,您的数据库的排序规则决定了字符串的比较和排序方式。
可能您当前(表格)的排序规则是区分大小写的。在Postgres中,这种整理可能是&#39; C&#39;或者&#39; POSIX&#39;。这意味着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);
自Laravel 5.3以来,Eloquent的get()
返回了一个集合。
(2)编写指定归类的原始SQL查询(在Laravel中),例如
DB::select('select name from users order by name COLLATE "en_US.utf8"');
此语句返回一个数组。
(3)为您的数据库选择另一个排序规则。该解决方案将来会避免类似的问题。
当您处于开发状态并使用Laravel的迁移和播种机时,最佳解决方案是
当你处于其他开发状态时,你可以
请注意,您也可以更改正在运行的数据库的排序规则,但要为数据库以及表格以及具有(默认)排序规则设置和索引问题的列做好准备。
答案 1 :(得分:2)
您可以简单地这样做:
$orderClause = 'UPPER('.colname.') ASC';
App\User::orderByRaw($orderClause);
答案 2 :(得分:0)
SORT_NATURAL|SORT_FLAG_CASE
不会orderBy
在sortBy
上与集合相关,不区分大小写的orderBy
不是一个雄辩的行为,最好是构建SQL直接在数据库上查询
答案 3 :(得分:0)
使用这个:Laravel 7.x 版(在 MySQL 中工作)
Institute::where('scholarshipTypeValueId',$valueId)->orderBy('instituteName','ASC')->get()->sortBy('instituteName',SORT_NATURAL|SORT_FLAG_CASE)->toJson();
或者只是进入一个数组使用
Institute::where('scholarshipTypeValueId',$valueId)->orderBy('instituteName','ASC')->get()->sortBy('instituteName', SORT_NATURAL|SORT_FLAG_CASE);