【发布时间】:2016-05-11 18:46:18
【问题描述】:
我有两个具有多对多双向关联的实体:$foo 和 $bar。 $foo 是拥有方。它们由一个中间表连接:foo_bar。
我需要克隆$foo 实体,以便新实体保留与$bar 的所有关联。它应该不创建新的$bar 记录,只需复制连接表foo_bar 中的记录。所以我会有两个$foo 对象,它们都指向同一个$bar 实体集合。
应该如何处理?
$foo 对象:
/*
* @ORM\ManyToMany(targetEntity="Sitetheory\CoreBundle\Entity\Bar", inversedBy="foos", cascade={"detach"})
* @ORM\JoinTable(name="foo_bar")
*/
protected $bars;
$bar 对象:
/*
* @ORM\ManyToMany(targetEntity="Sitetheory\CoreBundle\Entity\Foo", mappedBy="bars")
*/
protected $foos;
尝试失败
我尝试创建 $foo cascade={"**persist**", "detach"} 但这不起作用:它尝试创建新的 $bar 对象,这不是我们想要的。
我尝试重新关联这些关系(认为新的对象哈希会触发新的持久化),但这也不起作用。关于$foo__clone()函数:
public function __clone() {
$bars = $this->getBars();
if (!empty($bars)) {
$this->setBars(new ArrayCollection());
foreach ($bars AS $bar) {
$this->addBar($bar);
}
}
}
这只是给出了错误:
通过关系发现了一个新实体 'Sitetheory\CoreBundle\Entity\Foo#bars' 未配置为 实体的级联持久化操作:Woo。要解决此问题: 在这个未知实体上显式调用 EntityManager#persist() 或配置级联在映射中保留此关联 例如@ManyToOne(..,cascade={"persist"})。
但如果我确实在实体上添加了持久性,它会在插入新 Bar 时出现不同的错误,我当然不希望它这样做。
更新
显然,问题在于不应该有cascade={"detach"}。当我删除它时,克隆会自动运行。
【问题讨论】:
标签: symfony doctrine-orm