当我尝试添加新信息项时,它会插入其中两个或没有。在下面的代码状态中,它插入两个。如果我发表评论,它就不会插入。当我用$ 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;
...
}
答案 0 :(得分:0)
Doctrine基于身份映射,它保留对所有处理的对象的引用(即:如果您尝试通过id查询同一记录两次,第一次点击数据库但是第二次not和object从Identity Map加载。)
当您使用$em->clear()
时,您将所有对象“丢弃”到Identity Map中,因此,do ... while
的下一次迭代将导致一个全新的对象(从ORM的角度来看)将被标记为写作。