sql - 如何按条件请求列“值喜欢(或包含)特定数组中的字符串(或正则表达式)之一?
问题描述
我需要检索具有特定列包含、等于或喜欢特定数组中的单词之一的所有记录。
我说的是“包含”,因为在数据库中,一些值是复数形式,而另一些是单数形式;比如:“狗”和“狗”。
所以我将提供一个数组作为 ['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 . '%)');
})
但它显然不起作用。能否请你帮忙?谢谢
解决方案
如果您正在手动编写应该与其复数匹配的项目列表,您可以将单词添加到数组中吗?IE:
['cat', 'cats', 'dog', 'dogs']; // etc
但是,如果您需要使用必须包含复数以在数据库中匹配的动态列表,可能最简单的方法是遍历数组并使用来自Laravel的String 助手添加复数:
$plurals = [];
foreach ($animals as $animal){
$plurals[] = Str::plural($animal);
}
然后将数组 ($animals
和$plurals
) 合并为一个,您可以whereIn('name', $animalsMerged)
在查询上执行一次。
推荐阅读
- javascript - 无法将某些文件上传到 Google Drive?
- javascript - 无法在 react-redux-form 控件中包装 react-autocomplete 元素
- android - AWS Mobile 内置登录问题
- highcharts - 如何减少高车周围的面积?
- java - 显示居中对齐的 Web 视图
- vba - 在VBA的列中选择可变的空白单元格范围
- java - 如何使用 Jerseys @Path AND java.nio.file.Path?
- javascript - Typescript 2d 数组定义引发错误
- machine-learning - 经过训练的 SVM 的训练准确率为 0%
- python - 在一行中的列表中访问字典中的列表值