【问题标题】:Laravel query hasMany where rows with custom valuesLaravel 查询 hasMany where 具有自定义值的行
【发布时间】:2018-09-13 09:50:27
【问题描述】:

我的数据库中有以下表格:

TABLE_PRODUCTS
id
name

TABLE_VARIANTS
id
product_id
sku

TABLE_VARIANTS_PROPERTIES
id
variant_id
property_value_id

我正在尝试构建用于过滤产品的查询。假设我只想显示具有 property_value_id=1 和 property_value_id=2 变体的产品

关系:PRODUCTS -> hasMany -> VARIANTS -> hasMany -> VARIANTS_PROPERTIES。

有什么想法吗?


更新:

我使用了 Alexandr Peters 的答案。这是我的代码:

$query->whereHas('variants.properties.propertiesValues', function ($query) use ($variants) {
        $query->whereIn('value', $variants);
    });

更具体地说,我的查询中有一个我之前没有指定的表。此查询有效,但不如预期。我想做的是: 获取所有具有 PRODUCTS_VARIANTS 的 PRODUCTS_VARIANTS_PROPERTIES 具有 PRODUCTS_PROPERTIES_VALUES 作为有源过滤器 (VARIANTS) 的产品。我知道所有变体 - 我为此使用笛卡尔积。 因此,例如,我需要获取所有具有变体的产品,这些变体具有过滤器中变体的所有值。此查询仅在存在仅具有 1 个值的变体时才有效。我该如何解决这个问题?我正在尝试使用 foreach($variants as ...) 但没有运气。仍然没有按预期 100% 工作。

表格:

TABLE_PRODUCTS
id
name

TABLE_PRODUCTS_VARIANTS 
id
product_id
sku

TABLE_PRODUCTS_VARIANTS_PROPERTIES
id
variant_id
property_value_id

TABLE_PRODUCTS_PROPERTIES_VALUES
id
value

有源过滤器的所有可能变体都在嵌套数组中,例如我有颜色为黑色和红色的有源过滤器以及尺寸过滤器 XS:

[
0 => [
    0 => Black
    1 => XS
  ]
1 => [
    0 => Red
    1 => XS
  ]
]

我需要检查列值中最后一个表 TABLE_PRODUCTS_PROPERTIES_VALUES 中 VARIANTS 数组的值。但它需要同时具有两个值(黑色和 XS)

有什么想法吗?


更新 - 已解决

好的,我终于解决了。这是我的代码:

$query->whereHas('variants', function ($query) use ($variants) {
        $i = 1;
        foreach($variants as $variant)
        {
            if($i == 1) {
                $query->whereHas('properties', function($query) use ($variant) {
                    $query->whereHas('propertiesValues', function($query) use ($variant) {
                        $query->whereIn('value', $variant);
                    });
                }, '=', count($variant));
            } else {
                $query->orWhereHas('properties', function($query) use ($variant) {
                    $query->whereHas('propertiesValues', function($query) use ($variant) {
                        $query->whereIn('value', $variant);
                    });
                }, '=', count($variant));
            }

            $i++;
        }
    });

任何想法如何使它不那么复杂? :)

【问题讨论】:

    标签: laravel select has-many


    【解决方案1】:

    嵌套的 haswhereHas 语句也可以使用“点”表示法构造。例如,您可以检索至少有一条评论和投票的所有帖子。因此,如果您想从产品中查询嵌套的 variant_properties,您必须在 whereHas

    中添加点“relation1.relation2
    $ids = [1,2];
    $products = Product::whereHas('variants.variants_properties', function ($query) use ($ids) {
        $query->whereIn('property_value_id', $ids);
    })->get();
    

    【讨论】:

    • 这不起作用,因为 property_variant 没有加入,你在问 whereIn
    • 不需要加入表,因为where有查询关系。这是我用于过滤具有多对多关系的产品的属性或类别的 100% 工作代码
    • 也许我遗漏了一些东西,但是你在哪里使用 whereHas 来表 TABLE_VARIANTS_PROPERTIES ?您只是使用 whereHas 到 TABLE_VARIANTS。或者是whereIn在mysql查询中生成whereHas?
    • 变体不是表格。 ii 是多对多关系。我已经更新了我的答案,以表明你可以建立关系。
    • 抱歉,这对我不起作用。老实说,我不明白您对多对多关系的回答。也许它不起作用,因为我的查询中有更多的关系,但我只是想以简单的方式在这里写...
    猜你喜欢
    • 2018-06-12
    • 2020-11-15
    • 1970-01-01
    • 2019-06-02
    • 2018-04-27
    • 1970-01-01
    • 1970-01-01
    • 2014-05-09
    • 2017-08-25
    相关资源
    最近更新 更多