我有两个具有ManyToMany双向关联的实体:$ foo和$ bar。 $ foo是拥有方。它们由中间表连接:foo_bar。
我需要克隆 $foo
实体,以便新实体保留与$bar
的所有关联。它应不创建新的$ bar记录,只需复制加入表foo_bar
中的记录。所以我会有两个$foo
个对象,都指向同一个$bar
实体集合。
应如何处理?
/*
* @ORM\ManyToMany(targetEntity="Sitetheory\CoreBundle\Entity\Bar", inversedBy="foos", cascade={"detach"})
* @ORM\JoinTable(name="foo_bar")
*/
protected $bars;
/*
* @ORM\ManyToMany(targetEntity="Sitetheory\CoreBundle\Entity\Foo", mappedBy="bars")
*/
protected $foos;
我尝试过制作$ foo cascade = {" 坚持","分离"},但这不起作用,它试图创建新的$ 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 \实体\富#酒吧'没有配置 实体的级联持久化操作:Woo。要解决这个问题: 在这个未知实体上显式调用EntityManager#persist() 或者配置级联在映射中保持此关联 例如@ManyToOne(..,cascade = {" persist"})。
但是,如果我确实在实体上添加了持久性,那么在插入新的条形图时会出现不同的错误,当然我也不希望这样做。
显然问题是不应该有级联= {"分离"}。当我删除它时,克隆自动完成。
答案 0 :(得分:2)
您可以使用https://github.com/myclabs/DeepCopy
轻松复制对象及其属性这很简单
$deepCopy = new DeepCopy();
$myCopy = $deepCopy->copy($myObject);
还有一份非常好的文档。
答案 1 :(得分:0)
const numbers = [1, 2, 3, 4, 5],
map = new Map([ ["a", 1], ["b", 2], ["c", 4] ]),
set = new Set(map.values()),
missing = numbers.filter(n => !set.has(n))
console.log(missing)
public function __clone() {
$foos = $this->getFoos();
foreach ($foos AS $foo) {
$foo->addBar($bar);
}
}