Php 基于关系组合的条令过滤

Php 基于关系组合的条令过滤,php,symfony,doctrine-orm,Php,Symfony,Doctrine Orm,我真的很感激任何关于这一点的意见,因为这对我来说有点让人头痛 我们有4个与产品相关的实体,类别>产品>变体>变体属性 VariantProperty是一个键值对,即“color”=>“Blue”。产品有许多变体,类别有许多产品 我正试图从产品存储库中找到一种方法,找到包含一个变体的产品,该变体具有一组匹配的VariantProperties。标准将不起作用,因为它如何与关系深度afaik一起工作,并且使用存储库方法,我可以筛选出一个具有一个匹配VariantProperty的变体的产品 不过,我

我真的很感激任何关于这一点的意见,因为这对我来说有点让人头痛

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

VariantProperty是一个键值对,即“color”=>“Blue”。产品有许多变体,类别有许多产品

我正试图从产品存储库中找到一种方法,找到包含一个变体的产品,该变体具有一组匹配的VariantProperties。标准将不起作用,因为它如何与关系深度afaik一起工作,并且使用存储库方法,我可以筛选出一个具有一个匹配VariantProperty的变体的产品

不过,我想不出如何通过一组VariantProperties进行过滤。我试着在代码中这样做,但是由于我们有大量的变化,我最终使用了100mb+并且花费的时间太长

类别与产品有很多关系 产品与变体之间存在一对一的关系 变体与VariantProperties之间存在一种单一的关系

这是因为每个变量的属性类型不同


我唯一的另一个想法是找到一组匹配的VariantProperties,这些VariantProperties根据VariantID进行分组,然后从那里开始,但这对我来说似乎有点不对劲。

我能想到的唯一可行的方法是将您感兴趣的VariantProperties连接起来(没有左边),并结合一个
按产品分组
和一个有计数的
(variant)=:expertedvariants

我将尝试用一段伪DQL进行解释,通过两个变量进行过滤:

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

您是否在产品存储库中尝试过类似的方法

 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();
}

你为什么要在分类库中这样做?如果你想查找产品,你应该在产品库中工作。无论如何,你不能简单地在DQL中使用正确的左连接和变量属性的where条件进行查询吗?我是否遗漏了什么?抱歉,我指的是产品库。现在更正了。我确信我可以,我有问题很可能遗漏了一些东西,但我想不出最好的方法来构造查询,使其只返回带有一组VariantProperty实体匹配变量的产品。例如,我需要找到一个带有变量的产品,该变量与VariantProperty实体匹配“color”=>“red”,与实体匹配“Width”=>“8088”。我很可能布莱在这一点上遗漏了一些明显的东西。+1这正是我们所需要的,谢谢。我有一个实现,如果它能帮助其他人,我很高兴与大家分享。