Laravel Eloquent 不区分大小写的查询

Posted

技术标签:

【中文标题】Laravel Eloquent 不区分大小写的查询【英文标题】:Laravel Eloquent case-insensitive query 【发布时间】:2018-11-05 19:24:57 【问题描述】:

我想收集名称在数组中的所有标签的 id。为此,我使用whereIn,如下所示:

$tags = Category::whereIn('name', $tag_names)->pluck('id')->toArray(); 

我工作得很好,但我没有一个选项(据我所知)使whereIn 的运算符不区分大小写。

$tag_names 是一个标签名称数组,具有任意大小写。

'name' 是保存数据库中标签名称的列,其特定的大小写可能与$tag_names 中的不匹配。

Categorytable 的我的 postgresql 架构是:

CREATE TABLE categories (
    id SERIAL PRIMARY KEY,
    name TEXT NOT NULL UNIQUE,
    description TEXT,
    num_posts INTEGER DEFAULT 0 NOT NULL
);

【问题讨论】:

你可以试试whereIn('LCASE(name)',strtolower($tag_names)) @vivek_23 首先,第二个参数应该是array_map('strtolower', $tag_names)。其次,第一个参数会引发 Postgresql 错误,即使我尝试使用 lower 而不是 LCASE。无论如何,感谢您的帮助! 抱歉,我需要一些咖啡。顺便说一句,我在我的机器上检查了它,它确实工作正常。 【参考方案1】:

搜索中的数组使其变得更加困难。如果你想要一个不区分大小写的结果,你可以将它们都强制为一个大小写:

$tags = Category::whereIn( 'LCASE(name)' ,  strtolower($tag_names) )

或者,如果您想在不强制大小写的情况下进行匹配,您可以尝试:

$query = Category::with('tags');
foreach ($tag_names as $tag) 
     $query->whereHas('tag', function($q) use ($tag) 
         $q->where('name', 'ilike', $tag);
     );
 
 $query->get();

【讨论】:

我真的很喜欢第一种方法,但它不起作用。首先,第二个参数应该是array_map('strtolower', $tag_names)。其次,第一个参数会引发 Postgresql 错误,即使我尝试使用 lower 而不是 LCASE。无论如何,感谢您的帮助! 你必须使用原始表达式:whereIn(DB::raw('lower(name)'),

以上是关于Laravel Eloquent 不区分大小写的查询的主要内容,如果未能解决你的问题,请参考以下文章

使用用户名的 Laravel 身份验证不区分大小写

Laravel 不区分大小写的路由

Laravel 7 / SQL不区分大小写的where子句

Laravel“where”子句默认不区分大小写?

如何使 Laravel 中的路线不区分大小写?

使 Laravel 的 notIn 验证规则不区分大小写