我的数据库中有以下表格:
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++;
}
});
任何想法如何使它不那么复杂? :)
也可以使用“点”表示法构造嵌套的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();