Laravel 查询 hasMany where 具有自定义值的行
Laravel query hasMany where rows with custom values
我的数据库中有以下 table:
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 -> 变体 -> hasMany -> VARIANTS_PROPERTIES。
有什么想法吗?
更新:
我使用了 Alexandr Peters 的回答。这是我的代码:
$query->whereHas('variants.properties.propertiesValues', function ($query) use ($variants) {
$query->whereIn('value', $variants);
});
更具体地说,我的查询中还有一个 table,我之前没有指定。此查询有效但不符合预期。我想做的是:
获取所有具有 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 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 语句也可以使用 "dot" 表示法构造。例如,您可以检索至少有一个评论和投票的所有帖子。因此,如果您想从产品中查询嵌套的 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();
我的数据库中有以下 table:
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 -> 变体 -> hasMany -> VARIANTS_PROPERTIES。
有什么想法吗?
更新:
我使用了 Alexandr Peters 的回答。这是我的代码:
$query->whereHas('variants.properties.propertiesValues', function ($query) use ($variants) {
$query->whereIn('value', $variants);
});
更具体地说,我的查询中还有一个 table,我之前没有指定。此查询有效但不符合预期。我想做的是: 获取所有具有 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 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 语句也可以使用 "dot" 表示法构造。例如,您可以检索至少有一个评论和投票的所有帖子。因此,如果您想从产品中查询嵌套的 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();