php - Laravel 不区分大小写的 orderBy

标签 php postgresql laravel laravel-5 eloquent

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

$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 的 Migrations 和 Seeders 时,最好的解决方案是

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

当你处于其他开发环境时,你可以

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

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

关于php - Laravel 不区分大小写的 orderBy,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44756938/

相关文章:

php - 将 Laravel $validation->messages() 转换为对象数组的优雅代码

javascript - 客户端和服务器端编程有什么区别?

php - 如何使用 Controller 为 laravel 数据库中的特定列创建随机字符串值?

javascript - Ajax 数据库插入不起作用

提取新记录的sql查询

mysql - 使用外键将 MySQL 代码转换为 PostgreSQL

ruby-on-rails - 尝试在本地访问我的应用程序时,我得到 : "could not translate host name ... to address" and "Temporary failure in name resolution"

php - Laravel 和 Nginx 静态文件

Laravel hasManyThrough() 在标签和帖子之间

php - Silverstripe 过滤器关系 AND 代替 OR