我真的很感激对这一点的任何意见,因为它对我来说有点头疼。
我们有4个与产品相关的实体,类别>产品>变体> VariantProperty。
VariantProperty是一个键值对,即' Color' => '蓝色&#39 ;.产品有很多变种和类别有很多产品。
我试图从产品资源库中找到一种方法来查找包含Variation并具有一组匹配的VariantProperties的产品。由于它与关系深度afaik和使用存储库方法如何工作,标准不会起作用我可以过滤以找到一个具有一个匹配VariantProperty的变体的产品。
我无法想象如何通过一组VariantProperties进行过滤。尝试在代码中执行此操作,但随着我们的变化量,我最终使用100mb +并且耗时太长。
类别与Product有ManyToMany关系 产品与Variants具有OneToMany关系 和Variants与VariantProperties有一个OneToMany关系。
这是由于每个变体的属性类型不同而完成的。
我唯一的另一个想法就是找到一组匹配VariantProperties的VariantProperties,并从那里开始,但这对我来说似乎有点不好看。
答案 0 :(得分:1)
我能想到的唯一可行的方法是加入您感兴趣的变体(没有左侧),加上GROUP BY product
和HAVING COUNT(variant) = :expetedVariants
。
我尝试用一段伪DQL解释,过滤2个变种:
SELECT p
FROM product
JOIN variant
JOIN variantProperty
WHERE
(variantProperty.name = variantName1 AND variantProperty.value = variantValue1)
OR
(variantProperty.name = variantName2 AND variantProperty.value = variantValue2)
GROUP BY product
HAVING COUNT(variantProperty) = 2
答案 1 :(得分:0)
您是否在产品资料库中尝试过类似的内容?
public function findByProperties($properties)
{
$qb=$this->createQueryBuilder('prod')
->addSelect('var', 'varpro') //can remove if you don't want to hydrate these objects
->join('prod.variants', 'var')
->join('var.variantProperties', 'varpro');
$expr=$qb->expr()->orX('1=0');
$i=0;
foreach ($properties as $name => $value) {
$expr=$qb->expr()->orX($expr, $qb->expr()->andX('varpro.propertyName = :name'.$i, 'varpro.propertyValue = :value'.$i));
$i++;
}
$qb->andWhere($expr);
$i=0;
foreach ($properties as $name => $value) {
$qb->setParameter(':name'.$i, $name);
$qb->setParameter(':value'.$i, $value);
$i++;
}
return $qb->getQuery()->getResult();
}