Laravel查询hasMany哪里有自定义值的行

问题描述 投票:0回答:1

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

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的变体的产品

关系:产品 - > hasMany - > VARIANTS - > hasMany - > VARIANTS_PROPERTIES。

有任何想法吗?


更新:

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

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

更具体地说,我在查询中还有一个表,我之前没有指定。此查询有效,但不符合预期。我想要做的是:获取所有具有PRODUCTS_VARIANTS的PRODUCTS,其PRODUCTS_VARIANTS_PROPERTIES具有PRODUCTS_PROPERTIES_VALUES作为活动过滤器(VARIANTS)。我知道所有的变种 - 我正在使用笛卡尔积。因此,例如,我需要获得所有具有变体的产品,这些变体具有来自过滤器中的变体的所有值。仅当存在仅具有1个值的变体时,此查询才有效。我怎么解决这个问题?我正在尝试foreach($ variants为......)但没有运气。仍未按预期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数组的值。但它需要同时具有两个值(Black&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个回答
1
投票

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

$ids = [1,2];
$products = Product::whereHas('variants.variants_properties', function ($query) use ($ids) {
    $query->whereIn('property_value_id', $ids);
})->get();
© www.soinside.com 2019 - 2024. All rights reserved.