0

上下文

我在网上商店工作。网站上的每一个Product都可以有几个ProductVariations(例如sizecolor,...),其值是一个列表ProductVariationValue(例如XLLBlueRed,...)。

每个ProductVariationValue都绑定到一个ProductVariation(例如,您不能为Size选择Red)。

我正在尝试创建一个跟踪库存(Product, ProductVariations, ProductVariationValues)组合数量的库存管理系统。

Product <--> ProductVariation <--> ProductVariationValue

我设法通过创建一个Stock持有 aProduct和一个集合的实体来做到这一点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;

  // ...
}

当用户将 a 添加Product到他的购物车时,我创建一个OrderItem包含ProductVariationValues他们选择的实例:

/** @ORM\Entity */
public class OrderItem
{
  // ...

  /** @ORM\ManyToOne(targetEntity="AcmeDemoBundle:Product") */
  protected $product;

  /** @ORM\ManyToMany(targetEntity="AcmeDemoBundle:ProductVariationValues") */
  protected $productVariationValues;

  // ...
}

问题

我了解Stock实体与实体相似OrderItem。但是,当用户将 a 添加Product到他的购物车并且我正在构建OrderItem实体时,我找不到如何检索Stock实例以检查Product其是否ProductVariationValues有库存,因为我找不到要在Stock实体中添加的关系.

实际上,Stock实体不能由$productor$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()方法不能接受arrayArrayCollection参数。

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

我的实体模型错了吗?有没有一种简单的方法可以Stock在我的OrderItem班级中添加关系?或者至少要检索一个Stock项目,给定它的ProductProductVariationValues

4

1 回答 1

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

    // ...
  }
}
于 2013-04-22T17:35:07.097 回答