【问题标题】:How to make filter by different attribute values in laravel如何在laravel中按不同的属性值进行过滤
【发布时间】:2021-05-03 16:10:30
【问题描述】:

我试图使过滤器商店文章依赖于类似于tehnomanijaAmazon product filtering 的复选框产品使用 laravel 过滤我的复选框。每篇文章最多可以有一个属性和一个与该属性相关的值。

我做到了:

AttributeValue::whereIn('id', $attributeValues)->orderBy('attribute_id')
        ->select('id', 'attribute_id')->get()
        ->each(function ($item) use (&$attributes) {
            if (!isset($attributes[$item->attribute_id])) {
                $attributes[$item->attribute_id] = [];
            }
            $attributes[$item->attribute_id][] = $item->id;
        });

效果很好,在不同的子数组中创建一组选定的 id。但我不确定是否可以查询:

$articles->where(function ($q1) use ($attributes) {
        foreach ($attributes as $attribute) {
            $q1->whereIn('attr.attribute_value_id', $attribute);
        }
    });

但这并没有给我像这些示例页面那样的结果。 例如,如果我试图找到与此相关的电视:

  • 车型年份:2020 年和 2019 年
  • 连接类型:蓝牙和 USB
  • 刷新率:60Hz 结果将支持我的产品列表,这些产品的型号为 2019 年或 2020 年,连接类型为蓝牙或 USB,刷新率为 60Hz

这是数据库的样子:

articles:
id name
1  Whirlpool Washing machine

attributes:
id name
1  Color
2  Size
3  Type

attribute_values
id  attribute_id name
 1  1            Red
 2  1            White
 3  1            Black
 4  3            Freestanding
 5  4            Built-in

article_attribute_values
id  article_id  attribute_value_id
1   1           1
2   1           4

【问题讨论】:

  • 您是要在产品属性之间执行OR 操作,例如产品匹配这些属性中的任何一个,还是您需要AND 操作,产品应该匹配所有这些属性
  • “连接类型”(蓝牙或 USB 或以太网)等相同属性中的值之间的 OR 以及每个属性(连接类型 AND 刷新率和型号年份)之间的 AND
  • 好的,您能否向我们展示您的模型映射文章和属性以及这些属性如何保存在数据库中的示例数据?
  • 添加了一些与之相关的示例和数据库方案

标签: laravel search filter


【解决方案1】:

根据我对您问题的理解,您正在尝试匹配一件事或另一件事,在这种情况下,您应该在循环中使用 orWhere

$articles->where(function ($q1) use ($attributes) {
    foreach ($attributes as $attribute) {
        $q1->orWhere('attr.attribute_value_ida', '=', $attribute);
    }
});

【讨论】:

  • 不是真的 :( 看看我对第一条评论有问题的评论
  • 我更新了我的问题,也许你会有更好的主意。
【解决方案2】:

也许有人也有一些问题。我找到了解决这个问题的方法,并愿意与您分享:

foreach ($attributes as $key => $values) {
        $articles->leftJoin('article_attribute_values as attr' . $key, 'attr' . $key . '.article_id', '=', 'articles.id')
            ->where(function ($q1) use ($values, $key) {
                foreach ($values as $value) {
                    $q1->orWhere('attr' . $key . '.attribute_value_id', $value);
                }
            });
    }

如果您只使用一个连接,它不起作用,需要有多个连接,您在查询中有多少属性,并且在每个连接中使用 OR 进行子查询,比较每个选定的值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-12
    • 1970-01-01
    • 2015-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多