如何通过调整所有ManyToMany关系来检索实体?

时间:2013-04-22 15:24:30

标签: php symfony doctrine-orm many-to-many

上下文

我正在网上商店工作。网站上的每个Product都可以有多个ProductVariation s(例如 size color ,...),这些值是{{ 1}}(例如 XL L 蓝色红色,......)。

每个ProductVariationValue都绑定到ProductVariationValue(例如,您无法为尺寸选择红色)。

我正在尝试创建一个跟踪库存ProductVariation组合数量的库存管理系统。

(Product, ProductVariations, ProductVariationValues)

我设法创建了一个Product <--> ProductVariation <--> ProductVariationValue 实体,其中包含StockProduct的集合:

ProductVariationValues

当用户将/** @ORM\Entity */ public class Stock { // ... /** @ORM\ManyToOne(targetEntity="AcmeDemoBundle:Product") */ protected $product; /** @ORM\ManyToMany(targetEntity="AcmeDemoBundle:ProductVariationValues") */ protected $productVariationValues; /** @ORM\Column(type="integer") */ protected $number = 0; // ... } 添加到购物车时,我会创建一个Product的实例,其中包含所选的OrderItem

ProductVariationValues

问题

我理解/** @ORM\Entity */ public class OrderItem { // ... /** @ORM\ManyToOne(targetEntity="AcmeDemoBundle:Product") */ protected $product; /** @ORM\ManyToMany(targetEntity="AcmeDemoBundle:ProductVariationValues") */ protected $productVariationValues; // ... } 实体与Stock实体类似。但是,当用户向他的购物车添加OrderItem并且我正在构建Product实体时,我找不到如何检索OrderItem实例来检查Stock是否Product的{​​{1}}有库存,因为我无法在ProductVariationValues实体中找到要添加的关系。

实际上,Stock实体无法通过Stock$product关系识别:它们需要放在一起。

我试图做的事情

在控制器中,给定$productVariationValues$product数组,用户已选中,我尝试设置查询以检索$productVariationValues实例。

Stock

此代码不起作用,因为class StockRepository { public function retrieveStock($product, $productVariationValues) { $this->getQueryBuilder('s') ->leftJoin('s.product', 'p') ->leftJoin('s.productVariationValues', 'pvv') ->where('s.product = ?') ->andWhere('s.productVariationValues = ?') ->setParameter(1, $product) ->setParameter(2, $productVariationValues); // ... } } 方法无法接受setParameter()array参数。

无论哪种方式,此解决方案都不是最佳的,因为必须从控制器运行此代码,否则我将无法从ArrayCollection实体运行它。

我的实体型号错了吗?有没有一种简单的方法可以在我的OrderItem课程中添加Stock关系?或至少检索一个OrderItem项,并指定StockProduct

1 个答案:

答案 0 :(得分:0)

您需要使用IN子句,并迭代所有值;类似的东西:

class StockRepository
{
  public function retrieveStock($product, $productVariationValues)
  {
    $qb=$this->getQueryBuilder('s');
    $qb->leftJoin('s.product', 'p')
        ->leftJoin('s.productVariationValues', 'pvv')
        ->where('s.product = ?')
        ->setParameter(1, $product)
        ;
    $stockVariationValues=$qb->getQuery()-
    >getSingleResult()->getProductVariationValues();

    $qb=$this->getQueryBuilder('s');
    $qb->leftJoin('s.product', 'p')
        ->leftJoin('s.productVariationValues', 'pvv')
        ->where('s.product = ?')
        ->setParameter(1, $product)
    ;

    $stockVariationValues->map(function ($element) use ($qb){
      $qb->andWhere($qb->expr()
        ->in('s.productVariationValues'
            ,  "'".implode(","
                ,$productVariationValues->toArray())
            ."'")
        );
    });

    // ...
  }
}