2012-02-20 1 views
4

私はいくつかのオブジェクトをカスケードで保存して取得しようとしています。 私は3つ以上の3つのエンティティを持っています。entityManager保存してリフレッシュ

Entites:エンティティオーバー

class Order 
{ 
    /** 
    * @var integer $id 
    * 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    protected $id; 

    /** 
    * @var object $basket 
    * 
    * @ORM\OneToOne(targetEntity="Entity\Basket", inversedBy="order") 
    */ 
    protected $basket; 
... 
} 

class Basket 
{ 
    /** 
    * @var integer $id 
    * 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    protected $id; 

    /** 
    * @var array $declinations 
    * 
    * @ORM\OneToMany(targetEntity="Entity\BasketDeclination", mappedBy="basket") 
    */ 
    protected $declinations; 

    /** 
    * Order owner (reversed side) 
    * 
    * @var OrderClient $order 
    * 
    * @ORM\OneToOne(targetEntity="Entity\Order", mappedBy="basket") 
    */ 
    protected $order; 
... 
} 

class BasketDeclination 
{ 
    /** 
    * @var integer $id 
    * 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    protected $id; 

    /** 
    * @var integer $basket 
    * 
    * @ORM\ManyToOne(targetEntity="Entity\Basket", inversedBy="declinations") 
    */ 
    protected $basket; 
... 
} 

オブジェクト:

class OrderObject 
{ 
    function __construct(
     EntityManager $em, 
     Order $entity = null, 
     BasketObject $basket = null 
    ) 
    { 
     $this->em = $em; 

     if (!$entity) { 
      $this->entity = new Order(); 

      $this->basket = $basket; 
     } else { 
      $this->setDataFromEntity($entity); 
     } 
    } 

    protected function setDataFromEntity(Order $entity) 
    { 
     $basketFactory = new BasketFactory($this->em); 

     $this->entity = $entity; 

     $this->basket = $basketFactory->getBasket($entity->getBasket()->getId()); 
    } 

    public function save($flush = false) 
    { 
     // save subObject 
     $this->basket->save(); 

     // set link 
     $this->entity->setBasket($this->basket->getEntity()); 

     $this->em->persist($this->entity); 

     if ($flush) { 
      $this->em->flush(); 
     } 
    } 

    public function refresh() 
    { 
     $this->em->refresh($this->entity); 
     $this->setDataFromEntity($this->entity); 
    } 
... 
} 

class BasketObject 
{ 
    function __construct(EntityManager $em, Basket $entity = null) 
    { 
     $this->em = $em; 

     if (!$entity) { 
      $this->entity = new Basket(); 
      $this->declinations = array(); 
     } else { 
      $this->setDataFromEntity($entity); 
     } 
    } 

    protected function setDataFromEntity(Basket $entity) 
    { 
     $this->entity = $entity; 

     $this->declinations = array(); 
     foreach ($entity->getDeclinations() as $declination) { 
      $this->declinations[] = new BasketDeclinationObject($this->em, $declination); 
     } 
    } 

    public function save($flush = false) 
    { 
     foreach ($this->declinations as $declination) { 
      $declination->save(); 
     } 
     $this->em->persist($this->entity); 
     if ($flush) { 
      $this->em->flush(); 
     } 
    } 
... 
} 

class BasketDeclinationObject 
{ 
    public function __construct(
      EntityManager $em, 
      BasketDeclination $entity= null, 
      BasketObject $basket = null) 
    { 
     $this->em = $em; 

     if (!$entity) { 
      $this->entity = new BasketDeclination(); 

      $this->basket = $basket; 
     } else { 
      $this->setDataFromEntity($entity); 
     } 
    } 

    protected function setDataFromEntity(BasketDeclination $entity) 
    { 
     $this->entity = $entity; 

     $declinationFactory = new DeclinationFactory($this->em); 
     $this->declination = $declinationFactory->getDeclination($entity->getDeclination()->getId()); 
    } 

    public function save($flush = false) 
    { 
     if ($this->quantity <= 0) { 
      $this->em->remove($this->entity); 
      $this->remove = true; 
      return ; 
     } 
     if (!$this->entity->getId()) { 
      $this->entity->setBasket($this->basket->getEntity()); 
     } 
     $this->entity->setQuantity($this->quantity); 
     $this->em->persist($this->entity); 
     if ($flush) { 
      $this->em->flush(); 
     } 
    } 
... 
} 

問題は私のテストでは、私はその後、バスケットを保存してBasketDeclinationすぎている を保存BasketDeclinationを追加するためのバスケットのためにしようとするということです。 は、それから私$バスケット - >)が(リフレッシュするとバスケットがリフレッシュされ、BasketDeclinaitonは、エンティティ

から再構築されますが、私はバスケットwhith順序を持っていると私はBasketDeclinaiton($ order->バスケット - > addDeclinationを(追加するとき。 ..)) 私はすべてのエンティティを保存するとき 私は注文を更新するとき、私は注文とバスケットを取得します。 エンティティ$ basket-> getDeclinations()には何もありません

私は間違っていますか?

+2

これは、暗闇の中で純粋なショットです(それはあなたがネストされたオブジェクトを操作するとき、あなたのプロキシが作成され、すべての権利を働いていることを確認するために、あまりにも常に良い考えです)リフレッシュする前にclear()を実行してください。私の貧しい脳が追いつくためには、あまりにも多くの物や物事が進行しています。また、問題を示す非常に単純なテストケースを投稿することを検討することもできます。 – Cerad

+0

1点...「あまりにも多くのオブジェクトがあり、私の貧弱な脳に続いていることがあります」 –

答えて

0

これはdoctrine1から覚えていますが、これはdoctrine1で最初の直接オブジェクトをリフレッシュするだけで、リレーションを処理して2番目のパラメータを追加する必要があります。deep = trueすべての関連オブジェクトも処理できます。あなたはそのようなものを調べることができます。

+0

'EntityManager-> refresh()' [method here](https:// github .com/doctrine/doctrine2/blob/master/lib/Doctrine/ORM/EntityManager.php#L666) – ManseUK

+0

大丈夫ですが、少し混乱しますが、なぜ$ this-> em-> refresh ($ this-> basket); 'refresh'関数の内部 –

0

問題は、エンティティ・マネージャがrefresh ING協会(Mohammad AbuShadyにより示唆されるように)、refresh操作をカスケード接続するためにあなたのエンティティを伝えるための答えではないことを確かにある場合。

class Basket 
{ 
    // ... 

    /** 
    * @var array $declinations 
    * 
    * @ORM\OneToMany(
    * targetEntity="Entity\BasketDeclination", 
    * mappedBy="basket", 
    * cascade={"refresh"} // THIS LINE ADDED 
    *) 
    */ 
    protected $declinations; 

    // ... 
... 
} 
0

私は2つの推測で行く:

  • は、あなたが「存続」カスケードを許可するようにクラスにカスケードアノテーションを使用し、おそらくあまりにも「リフレッシュ」カスケードする必要があります。 documentationに記載されています。ような何か:

    @ORM \ OneToOne(targetEntity = "エンティティ\順序"、mappedByは= "バスケット"、カスケード= { "持続"、 "削除"、 "リフレッシュ"})

  • あなたが不足していますリフレッシュする前にDeclinationにpersist()またはflush()を追加してください。カスケードしていない場合は、保持したいオブジェクトごとに呼び出す必要があり、次にrefresh()メソッドを呼び出します。 )($ EntityManagerを呼び出してみてください。

関連する問題