2017-11-14 9 views
0

明らかに単純な問題がありますが、数時間の試行錯誤の後、私は間違った結果しか得ません。Symfony:Datetimeフィールドを持つオブジェクトを複製し、複製されたオブジェクトの日付を追加する

目的は、HallReservationにOneToMany関係のオブジェクトConventionを複製し、この予約に数日を追加することです。私が得た結果は、複製されたオブジェクトと元のオブジェクトに日が追加され、元のオブジェクトを変更しないままにしておきたいということです。

これは重要なコードです:あなたは、私は、元のコンベンションホールの予約の日付もされているどこでもそれでもdatetimeオブジェクトのクローンを作成見たよう

 $jumpInterval = $originalConventionBeginDate->diff($newDate); 
     foreach ($newConvention->getHallReservation() as $newHallR) 
     { 
      $prevDate = clone $newHallR->getDate(); 
      $prevDate->add($jumpInterval); 

      $newHallR->setDate($prevDate); 
     } 
     $em->persist($newConvention); 
     $em->flush(); 

/** 
* @ORM\Entity() 
*/ 
class Convention 
{ 
/** 
* @ORM\OneToMany(targetEntity="HallReservation", mappedBy="convention", cascade={"all"}) 
*/ 
private $hallReservation; 

/** 
* Clone object 
* 
*/ 
public function __clone() 
{ 
    if ($this->id) 
    { 
     $this->id=null; 
     $this->reference = null; 
     $this->registrationDate = new \Datetime('now'); 

     foreach ($this->hallReservation as $hallR) 
     { 
      $clonedR = clone $hallR; 
      $clonedR->setConvention($this); 
      $newRDate = clone $hallR->getDate(); 
      $clonedR->setDate($newRDate); 
      $this->hallReservation->add($clonedR); 
     } 
    } 
} 

/** 
* @ORM\Entity() 
*/ 
class HallReservation 
{ 
/** 
* @var \Date 
* 
* @ORM\Column(name="date", type="date") 
*/ 
private $date; 

/** 
* Clone object 
* 
*/ 
public function __clone() 
{ 
    if ($this->id) 
    { 
     $this->id=null; 
     $clonedDate = clone $this->date; 
     $this->date = $clonedDate; 

} 

コントローラー・コード追加されました。

+0

を? '__clone'メソッドを使わないで、新しいentitesをサービス内で手動で作成することも考えられます:/ – Mcsky

答えて

1

Conventionオブジェクトを複製するときは、hallReservationプロパティを新しいCollectionに設定しないでください。 DoctrineのOneToManyリレーションはCollectionオブジェクトにマップされているため、Conventionオブジェクトをクローンすると、クローンオブジェクトの元のhallReservationコレクションへの参照が取得されます。

あなたはこのような何かを試みることができる:あなたが ``ブロックであれば(の$ this - > ID)でログインしようとしました

<?php 

use Doctrine\Common\Collections\ArrayCollection; 

/** 
* @ORM\Entity() 
*/ 
class Convention 
{ 
/** 
* @ORM\OneToMany(targetEntity="HallReservation", mappedBy="convention", cascade={"all"}) 
*/ 
private $hallReservation; 

/** 
* Clone object 
* 
*/ 
public function __clone() 
{ 
    if ($this->id) 
    { 
     $this->id=null; 
     $this->reference = null; 
     $this->registrationDate = new \Datetime('now'); 
     $reservations = new ArrayCollection(); 

     foreach ($this->hallReservation as $hallR) 
     { 
      $clonedR = clone $hallR; 
      $clonedR->setConvention($this); 
      $newRDate = clone $hallR->getDate(); 
      $clonedR->setDate($newRDate); 
      $reservations->add($clonedR); 
     } 

     $this->hallReservation = $reservations; 
    } 
} 
関連する問題