添加一个相关实体并使用$ em-> clear()时,Doctrine插入两次

时间:2016-11-04 19:30:36

标签: symfony doctrine-orm

当我尝试添加新信息项时,它会插入其中两个或没有。在下面的代码状态中,它插入两个。如果我发表评论,它就不会插入。当我用$ em-> clear()评论该行时,它只插入一个,因为我需要它。我不明白什么,我做错了什么?

$limit = 10;
$offset = 0;
do {
    $products = $selectedModelQuery->getQuery()
        ->setFirstResult($limit * $offset)
        ->setMaxResults($limit)->getResult();
    $offset++;
    $count = count($products);
    /** @var \Nti\ApiBundle\Entity\Product $product */
    foreach ($selectedModelQuery->getQuery()->getResult() as $product) {
        if (!$product->getCollections()->contains($productCollection)) {
            $product->addCollection($productCollection);

            $productInfo = new ProductInfo;
            $productInfo->setProduct($product);
            $productInfo->setData($productCollection->getMessage());
            $productInfo->setInfoType(ProductInfoInterface::TYPE_CUSTOM);

            //$em->merge($product);
            //$em->persist($productInfo);
        }
    }
    $em->flush();
    $em->clear();
} while ($count);

主要实体:

class Product {
    /**
     * @ORM\OneToMany(targetEntity="ProductInfo", mappedBy="product", cascade={"persist", "remove"})
     * @var ProductInfoInterface[]|ArrayCollection
     */
    protected $infoList;
    ....
}

相关实体:

class ProductInfo {
    /**
     * @ORM\ManyToOne(targetEntity="\Nti\ApiBundle\Entity\Product", inversedBy="infoList")
     * @ORM\JoinColumn(name="product_id", referencedColumnName="id", onDelete="CASCADE", nullable=false)
     */
    protected $product;
    ...
}

1 个答案:

答案 0 :(得分:0)

Doctrine基于身份映射,它保留对所有处理的对象的引用(即:如果您尝试通过id查询同一记录两次,第一次点击数据库但是第二次not和object从Identity Map加载。)

当您使用$em->clear()时,您将所有对象“丢弃”到Identity Map中,因此,do ... while的下一次迭代将导致一个全新的对象(从ORM的角度来看)将被标记为写作。