Symfony 2 - 具有一对多奏鸣曲媒体关系的克隆实体

Dar*_*and 1 doctrine symfony

我有一个与媒体实体有一对多关系的Product实体

/**
* @ORM\OneToMany(targetEntity="Norwalk\StoreBundle\Entity\ProductHasMedia", mappedBy="product", cascade={"persist"}, orphanRemoval=true )
*/
protected $imagenes;
Run Code Online (Sandbox Code Playgroud)

与Package实体的一对一关系

/**
* @ORM\OneToOne(targetEntity="Package", cascade={"persist"})
* @ORM\JoinColumn(name="package", referencedColumnName="id")
*/
protected $package;
Run Code Online (Sandbox Code Playgroud)

我能够使用此功能克隆Product实体

public function __clone() {
        if ($this->id) {
            $this->package = clone $this->package;
        }
        // Get current collection
        $imagenes = $this->getImagenes();
        $this->imagenes = new ArrayCollection();
        if(count($imagenes) > 0){
            foreach ($imagenes as $imagen) {
                $cloneImagen = clone $imagen;
                $this->imagenes->add($cloneImagen);
                $cloneImagen->setProduct($this);
            }
        } 
}
Run Code Online (Sandbox Code Playgroud)

问题是,新实体已将与原始实体相同的图像关联起来.这意味着如果我删除一个实体中的图像,它也会被删除.请参阅下表,其中原始产品(ID为5)与克隆产品具有相同的介质(ID为7)

克隆表

我需要的是,这些克隆的图像有一个新的ID,而II需要它们与原始实体无关,例如,当我从克隆实体中删除一些图像时,它不会影响到原始实体.

有任何想法吗?:)

提前致谢

Mic*_*bov 9

你忘了所有的操作都必须在if ($this->id)块内:

public function __clone() {
    if ($this->id) {
        $this->package = clone $this->package;
        $imagenes = $this->getImagenes();
        $this->imagenes = new ArrayCollection();
        if(count($imagenes) > 0){
            foreach ($imagenes as $imagen) {
                $cloneImagen = clone $imagen;
                $this->imagenes->add($cloneImagen);
                $cloneImagen->setProduct($this);
            }
        } 
    }
}
Run Code Online (Sandbox Code Playgroud)

此外,如果您的Norwalk\StoreBundle\Entity\ProductHasMedia班级中有一些链接,那么您应该实施__clone()管理此实体中的相应字段.