我正在使用 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
和 Collections。 最佳答案
1. 为什么会得到这个结果?
它实际上是您的数据库的排序规则,它决定了字符串的比较和排序方式。
可能您当前的(表)排序规则是区分大小写的。在 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);
从 Laravel 5.3 开始,Eloquent 的
get()
返回一个集合。(2) 写一个指定排序规则的原始 SQL 查询(在 Laravel 中),例如
DB::select('select name from users order by name COLLATE "en_US.utf8"');
此语句返回一个数组。
(3) 为您的数据库选择另一个排序规则。此解决方案将避免将来出现类似问题。
当您处于开发环境并使用 Laravel 的迁移和播种机时,最好的解决方案是
当您处于其他开发情况时,您可以
请注意,您也可以更改正在运行的数据库上的排序规则,但要为数据库、表以及具有(默认)排序规则设置的列和索引问题做好准备。
关于php - Laravel 的 orderBy 不区分大小写,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44756938/