使用ManyToMany关联克隆实体

时间:2016-02-02 19:36:40

标签: symfony doctrine-orm

我有两个具有ManyToMany双向关联的实体:$ 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 = {" 坚持","分离"},但这不起作用,它试图创建新的$ 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"})。

但是,如果我确实在实体上添加了持久性,那么在插入新的条形图时会出现不同的错误,当然我也不希望这样做。

更新

显然问题是不应该有级联= {"分离"}。当我删除它时,克隆自动完成。

2 个答案:

答案 0 :(得分:2)

您可以使用https://github.com/myclabs/DeepCopy

轻松复制对象及其属性

这很简单

$deepCopy = new DeepCopy();
$myCopy = $deepCopy->copy($myObject);

还有一份非常好的文档。

答案 1 :(得分:0)

  1. 这取决于拥有者。在你的情况下,$ foo对象是关系的所有者。如果您克隆它-克隆的孩子将有孩子。如果要克隆$ bar对象-您将需要使用类似
  2. 的方法更改__clone函数
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)
  1. 确保您拥有所有者的级联持久性
public function __clone() {
   $foos = $this->getFoos();

   foreach ($foos AS $foo) {
      $foo->addBar($bar);
   }
}