【发布时间】: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++;
}
});
任何想法如何使它不那么复杂? :)
【问题讨论】: