mysql - Laravel 过滤多个WhereIn 数组

标签 mysql sql arrays laravel where-in

我正在尝试为电子商务商店创建过滤器。用户可以通过标签过滤产品,每个 flavor 标签都附加到一个数组:$tags_array

即 显示包含“kiwi”AND“menthol”标签的所有产品

dd($tags_array);

array:2 [
  0 => "kiwi"
  1 => "menthol"
]

过滤查询部分

$query = $tags_array ? $query
 ->join('product_product_tag', 'products.id', '=', 'product_product_tag.product_id')
 ->join('product_tags', 'product_tags.id', '=', 'product_product_tag.tag_id')
 ->whereIn('product_tags.value', $tags_array) : $query;

-一个产品有多个标签

-一个标签属于多个产品

product_tags

id | value 
------------------
1  | kiwi 
2  | apple
3  | menthol 
4  | strawberry 

-数据透视表:product_product_tag

product_product_tag

id | product_id | tag_id 
----------------------------
1  |    1       |    1
2  |    1       |    3
----------------------------
3  |    2       |    1
4  |    2       |    2
5  |    2       |    3
----------------------------
6  |    3       |    1
7  |    3       |    4
----------------------------
8  |    4       |    3

问题

当前查询显示所有带有奇异果OR薄荷醇标签的产品。

实际结果:产品:1, 2, 3, 4

预期结果:产品:1, 2

当仅应用一个标记时,此查询可以正常工作。如何使此过滤器包含应用的多个标签(产品具有猕猴桃标签薄荷醇标签)。用户可以按 0,1,2,3,... 标签进行过滤

是否有处理动态数量标签的最佳实践?

编辑:我正在使用 Laravel DB 查询生成器

第二次编辑:尝试 btl 的答案

  $query = $tags_array ? $query
      ->join('product_product_tag', 'products.id', '=', 'product_product_tag.product_id')
      ->join('product_tags', 'product_tags.id', '=', 'product_product_tag.tag_id') : $query;
  if($tags_array) {
      foreach ($tags_array as $tag) {
          $query->where('product_tags.value', '=', $tag);
      }
  }

第三次编辑:转向以下内容:

$query = $tags_array ? $query
 ->join('product_product_tag', 'products.id', '=', 'product_product_tag.product_id')
 ->join('product_tags', 'product_tags.id', '=', 'product_product_tag.tag_id')
 ->where('product_tags.value', $tags_array) : $query;

这仍然是不正确的。当前过滤器返回找到的第一个标签的结果。将继续努力寻求更加动态的解决方案

最佳答案

whereIn('product_tags.value', $tags_array) 将匹配数组中至少包含一个标签的所有内容,因此它的行为为 OR。如果您需要只匹配所有选定标签的产品,则需要设置多个where子句,其效果是:

$query = Product::with('tags');
foreach ($tags_array as $tag) {
     $query->whereHas('tags', function($q) use ($tag) {
         $q->where('id', $tag);
     });
 }
 $query->get();

编辑

$query = $tags_array ? $query
 ->join('product_product_tag', 'products.id', '=', 'product_product_tag.product_id')
 ->join('product_tags', 'product_tags.id', '=', 'product_product_tag.tag_id');

foreach ($tags_array as $tag) {
    $query->where('product_tags.id', '=', $tag);
}

关于mysql - Laravel 过滤多个WhereIn 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48633629/

相关文章:

sql - 如何在 oracle 中将 YYYYMMDD 转换为 DD-Mon-YYYY?

javascript - 如何通过数组条目的值获取其 "rank"?

mysql - 如何使用以逗号分隔的行中的 where 子句数据来选择查询

php - 更新到 MAMP 3 并丢失了我的数据库文件

c# - Entity Framework 强制 CASE-WHEN 列不可为空

mysql - 连接多个查询错误

ruby - 搜索符号数组 - Ruby

arrays - 如何在 Postgresql 中获取数组的 JavaScript/JSON 数组?

mysql - MySQL 是否会在更新时覆盖具有相同值的列?

php - 统计正反票数 :