Symfony 2 - 具有一对多奏鸣曲媒体关系的克隆实体
Symfony 2 - Clone entity with one to many sonata media relationship
我有一个与媒体实体具有一对多关系的产品实体
/**
* @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);
}
}
}
问题是,新实体关联了与原始实体相同的图像。这意味着如果我删除一个实体中的图像,它也会在另一个实体中删除。请参阅下面的 table,其中原始产品(ID 为 5)与克隆产品(ID 为 7)具有相同的媒体
我需要的是,这些克隆的图像有一个新的ID,我需要它们与原始实体无关,所以例如,当我从克隆实体中删除一些图像时,它不会影响到原始实体。
有什么想法吗? :)
提前致谢
您忘记了所有操作都必须在 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
class 中有一些链接,那么您也应该实施 __clone()
并管理该实体中的适当字段。
我有一个与媒体实体具有一对多关系的产品实体
/**
* @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);
}
}
}
问题是,新实体关联了与原始实体相同的图像。这意味着如果我删除一个实体中的图像,它也会在另一个实体中删除。请参阅下面的 table,其中原始产品(ID 为 5)与克隆产品(ID 为 7)具有相同的媒体
我需要的是,这些克隆的图像有一个新的ID,我需要它们与原始实体无关,所以例如,当我从克隆实体中删除一些图像时,它不会影响到原始实体。
有什么想法吗? :)
提前致谢
您忘记了所有操作都必须在 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
class 中有一些链接,那么您也应该实施 __clone()
并管理该实体中的适当字段。