通过这种关系找到了一个新的实体 - 学说

时间:2015-09-15 03:41:55

标签: doctrine-orm entity

我有一个缓存的实体产品。我检索实体并更新一些属性,包括向其中添加价格。

关系设置如下

class Product
{
    /**
     * @var ArrayCollection
     *
     * @ORM\OneToMany(targetEntity="Price", mappedBy="product", fetch="EXTRA_LAZY")
     */
    private $prices;
}

class Price
{
    /**
     * @var Product
     *
     * @ORM\ManyToOne(targetEntity="Product", inversedBy="prices")
     * @ORM\JoinColumn(name="product_id", referencedColumnName="id")
     */
    private $product;
}

我正在尝试保存这样的属性。

// Here $em is Entity Manager
$cacheDriver = $em->getConfiguration()->getResultCacheImpl();
$product = $cacheDriver->fetch($key)
$product->setUpdatedAt(new \DateTime());
$price = new Price;

$label = $em->getReference(PriceLabelEntity::class, $labelId);
$price->setLabel($label)
      ->setPriceLabelId($labelId)
      ->setProduct($productEntity)
      ->setProductId($product->getId());

$em->persist($price);
$product->addPrice($price);
$em->flush();

但每当我这样做时,我都会得到例外说法。

A new entity was found through the relationship 'Price#product' that was not     
configured to cascade persist operations for entity:     
Product@0000000043c0cdc400007fec6b41ca76. To solve this issue: Either    
explicitly call EntityManager#persist() on this unknown entity or configure   
cascade persist this association in the mapping for example 
@ManyToOne(..,cascade={"persist"}). If you cannot find out which entity 
causes the problem implement 'Product#__toString()' to get a clue.

如果我这样做,那就更奇怪了。

$product->setUpdatedAt($timeStamp);
$em->flush();

它不会抛出任何错误,但DB中没有保存数据。不确定这些问题是否相关。

我也尝试过级联,但它会产生不同的错误。有没有办法解决这个问题。

2 个答案:

答案 0 :(得分:0)

据我了解,Doctrine实体经理在管理结果缓存方面相当熟练(至少,人们会希望),因此直接摆弄它可能是个问题。

不要直接点击结果缓存,而是尝试使用:

$product = $entityManager->find('Product',$key);

然后,你似乎在最后一行也有一个拼写错误 - 在“entityManager”中缺少“e” - 但我确信会抛出错误,所以在创建这个问题时它可能是一个复制/粘贴问题。

编辑:您还同时使用$product$productEntity。如果它们是同一个变量,你应该选择一个名字并坚持下去。

答案 1 :(得分:0)

@Rushing非常感谢你的回复。你是对的有一些拼写错误,因为我必须在代码中进行一些更改以粘贴到StackOverflow中,但实际的代码是正确的。对不起,我对这个话题的回答有点迟了。您提供的解决方案很好,但更好的解决方案是使用这样的合并。

$productEntity = $em->merge($productEntity);
....rest of the logic

通过这种方式,我们不必再次查询数据库,实体是新的。