我正在网上商店工作。网站上的每个Product
都可以有多个ProductVariation
s(例如 size , color ,...),这些值是{{ 1}}(例如 XL , L ,蓝色,红色,......)。
每个ProductVariationValue
都绑定到ProductVariationValue
(例如,您无法为尺寸选择红色)。
我正在尝试创建一个跟踪库存ProductVariation
组合数量的库存管理系统。
(Product, ProductVariations, ProductVariationValues)
我设法创建了一个Product <--> ProductVariation <--> ProductVariationValue
实体,其中包含Stock
和Product
的集合:
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
项,并指定Stock
和Product
?
答案 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())
."'")
);
});
// ...
}
}