【发布时间】:2017-11-24 11:12:00
【问题描述】:
我有一个标签集合,每个标签都有一个映射集合(一对多关系)。问题是,当我尝试循环这个映射集合,然后刷新我的实体管理器时,会创建所有标签的副本,我不明白为什么。
这是带有批量大小的代码。第一个 foreach 循环标签集合,然后我得到这个标签的所有映射。然后,我在 foreach 上刷新我得到一个异常,但如果我在最后(在 for 之后)只刷新一次,它就可以工作。你能帮我么?
这是一个例外:
使用参数 ["Test 1"] 执行“INSERT INTO tag (name) VALUES (?, ?, ?)”时发生异常: SQLSTATE[23000]:完整性约束违规:1062 键 'UNIQ_C09225D35E237E06' 的重复条目 'Test 1'
代码如下:
$batchSize = 100; //Entity Manager will flush every batchSize times
$i = 0;
foreach ($aTagCollection as $oTag) {
$aMapping = $oTag->getMapping();
foreach ($aMapping as $oMapping) {
}
if (($i % $batchSize) === 0) {
$this->em->flush(); //Execute all updates every 100 times
$this->em->clear(); //Detaches all objects from Doctrine
}
$i++;
}
$this->em->flush();
实体标签
/** @ORM\OneToMany(targetEntity="Mapping",
mappedBy="customerLabel", fetch="EXTRA_LAZY",
cascade={"persist"}, orphanRemoval=true)
*/
private $mapping;
public function __construct()
{
$this->mapping = new ArrayCollection();
}
public function addMapping(Mapping $mapping)
{
$this->mapping[] = $mapping;
return $this;
}
public function removeMapping(Mapping $mapping)
{
$this->mapping->removeElement($mapping);
}
public function getMapping()
{
return $this->mapping;
}
以及实体映射:
/**
* @ORM\ManyToOne(targetEntity="Tag", inversedBy="mapping", cascade={"persist"})
* @ORM\JoinColumn(name="tag_id", referencedColumnName="id", onDelete="CASCADE")
*/
private $tag;
public function setTag(Tag $tag = null)
{
$this->tag= $tag;
return $this;
}
public function getTag()
{
return $this->tag;
}
非常感谢!
【问题讨论】:
-
我在你的代码中没有看到任何 persist() 只是 flush()
-
因此我不明白为什么要创建所有标签的副本...我只有一个冲洗和两个 foreachs,仅此而已
标签: php symfony exception doctrine arraycollection