上下文
我在网上商店工作。网站上的每一个Product
都可以有几个ProductVariation
s(例如size,color,...),其值是一个列表ProductVariationValue
(例如XL,L,Blue,Red,...)。
每个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
实体不能由$product
or$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
班级中添加关系?或者至少要检索一个Stock
项目,给定它的Product
和ProductVariationValues
?