通过关系组合过滤主义

时间:2017-03-15 14:10:47

标签: php symfony doctrine-orm

我真的很感激对这一点的任何意见,因为它对我来说有点头疼。

我们有4个与产品相关的实体,类别>产品>变体> VariantProperty。

VariantProperty是一个键值对,即' Color' => '蓝色&#39 ;.产品有很多变种和类别有很多产品。

我试图从产品资源库中找到一种方法来查找包含Variation并具有一组匹配的VariantProperties的产品。由于它与关系深度afaik和使用存储库方法如何工作,标准不会起作用我可以过滤以找到一个具有一个匹配VariantProperty的变体的产品。

我无法想象如何通过一组VariantProperties进行过滤。尝试在代码中执行此操作,但随着我们的变化量,我最终使用100mb +并且耗时太长。

类别与Product有ManyToMany关系 产品与Variants具有OneToMany关系 和Variants与VariantProperties有一个OneToMany关系。

这是由于每个变体的属性类型不同而完成的。

我唯一的另一个想法就是找到一组匹配VariantProperties的VariantProperties,并从那里开始,但这对我来说似乎有点不好看。

2 个答案:

答案 0 :(得分:1)

我能想到的唯一可行的方法是加入您感兴趣的变体(没有左侧),加上GROUP BY productHAVING 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();
}