【问题标题】:Clone an entity with a ManyToMany Association克隆具有多对多关联的实体
【发布时间】: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


    【解决方案1】:

    您可以使用https://github.com/myclabs/DeepCopy 轻松复制对象及其属性

    就这么简单

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

    还有一个很好的文档。

    【讨论】:

    • 谢谢。你知道克隆多对多关联的原生过程吗?
    【解决方案2】:
    1. 这取决于拥有方。在您的情况下, $foo 对象是关系的所有者。如果你克隆它 - 克隆的孩子将有孩子。如果你要克隆 $bar 对象 - 你需要用类似的东西来改变 __clone 函数
    public function __clone() {
       $foos = $this->getFoos();
    
       foreach ($foos AS $foo) {
          $foo->addBar($bar);
       }
    }
    
    
    1. 确保拥有级联持久化
    /*
     * @ORM\ManyToMany(targetEntity="Sitetheory\CoreBundle\Entity\Bar", inversedBy="foos", cascade={"persist"})
     * @ORM\JoinTable(name="foo_bar")
     */
    protected $bars;
    

    【讨论】:

      猜你喜欢
      • 2018-10-04
      • 2016-07-17
      • 1970-01-01
      • 2023-03-16
      • 2013-01-25
      • 2014-06-16
      • 2020-01-09
      • 1970-01-01
      相关资源
      最近更新 更多