【问题标题】:Symfony 2 - Clone entity with one to many sonata media relationshipSymfony 2 - 具有一对多奏鸣曲媒体关系的克隆实体
【发布时间】:2015-02-04 01:13:12
【问题描述】:

我有一个 Product 实体,它与媒体实体具有一对多关系

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

与包实体的一对一关系

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

我可以用这个函数克隆产品实体

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);
            }
        } 
}

问题是,新实体关联了与原始实体相同的图像。这意味着如果我删除一个实体中的图像,它也会在另一个实体中被删除。见下表,其中原始产品(id 5)与克隆产品(id 7)具有相同的媒体

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

有什么想法吗? :)

提前致谢

【问题讨论】:

    标签: symfony doctrine


    【解决方案1】:

    您忘记了所有操作都必须在 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);
                }
            } 
        }
    }
    

    此外,如果您的 Norwalk\StoreBundle\Entity\ProductHasMedia 类中有一些链接,那么您应该实现 __clone() 并管理该实体中的适当字段。

    【讨论】:

      猜你喜欢
      • 2017-04-13
      • 2017-11-17
      • 2013-12-04
      • 2015-04-07
      • 2017-09-17
      • 1970-01-01
      • 2018-12-08
      • 2017-04-09
      • 2013-10-02
      相关资源
      最近更新 更多