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
中的不匹配。
Category
table 的我的 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 不区分大小写的查询的主要内容,如果未能解决你的问题,请参考以下文章