顺序通过大小写与拉拉维尔不敏感

2022-08-31 00:39:39

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

$users = \App\User::orderBy('name')->get();

此代码返回如下内容:

Alix
Beatrice
Zorro
adam
bill

有没有办法让这个列表不区分大小写。我想有这样的东西:

adam
Alix
Beatrice
bill
Zorro

有没有办法得到一个“不区分大小写的排序依据”的结果?

我的问题是关于orderBy和Eloquent,而不是sortBy和Collections。


答案 1

1. 你为什么会得到这个结果?

实际上,数据库的排序规则决定了如何对字符串进行比较和排序。

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

2. 可能的解决方案

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

App\User::orderBy('name')->get()->sortBy('name', SORT_NATURAL|SORT_FLAG_CASE);

从Laravel 5.3开始,Eloquent's返回了一个集合。get()

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

DB::select('select name from users order by name COLLATE "en_US.utf8"');

此语句返回一个数组。

(3) 为数据库选择其他排序规则。此解决方案将避免将来出现类似问题。

当您处于开发环境中并使用Laravel的迁移和播种者时,最好的解决方案是

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

当您处于其他开发情况时,您可以

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

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


答案 2

您可以简单地执行以下操作:

$orderClause = 'UPPER('.colname.') ASC';
App\User::orderByRaw($orderClause);

推荐