首页 > 解决方案 > 如何按条件请求列“值喜欢(或包含)特定数组中的字符串(或正则表达式)之一?

问题描述

我需要检索具有特定列包含、等于或喜欢特定数组中的单词之一的所有记录。

我说的是“包含”,因为在数据库中,一些值是复数形式,而另一些是单数形式;比如:“狗”和“狗”。

所以我将提供一个数组作为 ['dog', 'cat',...] 并且我将搜索包含“dog”或“dogs”、“cat”或“cats”的列值。

我可以使用 whereIn 但这不包括复数名词。

我想把这里发现的另一个条件联系起来:Understanding ILIKE ANY element of an array - postgresql。所以我正在尝试:

    ->where(function($q) use ($animals) {
    $q->whereIn('name', $animals)
    ->orWhere('name', 'ilike ALL(', '%' . $animals . '%)');
    })

但它显然不起作用。能否请你帮忙?谢谢

标签: sqllaravelpostgresqlwhere-clausequery-builder

解决方案


如果您正在手动编写应该与其复数匹配的项目列表,您可以将单词添加到数组中吗?IE:

['cat', 'cats', 'dog', 'dogs']; // etc

但是,如果您需要使用必须包含复数以在数据库中匹配的动态列表,可能最简单的方法是遍历数组并使用来自Laravel的String 助手添加复数:

 $plurals = [];
 foreach ($animals as $animal){
     $plurals[] = Str::plural($animal);
 }

然后将数组 ($animals$plurals) 合并为一个,您可以whereIn('name', $animalsMerged)在查询上执行一次。


推荐阅读