2012-02-20 75 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是從實體重建

但是當我有一個籃子的命令, ..)) 當我保存所有實體保存 然後當我刷新訂單我回來的訂單和購物籃。 但實體$ basket-> getDeclinations()沒有任何東西

我在做什麼錯?

+2

這是一個在黑暗中的純鏡頭:嘗試調用$的EntityManager() - >在執行刷新之前清除()。你可能有太多的物體和事情發生在我可憐的大腦身上。您也可以考慮發佈一個非常簡單的測試案例來顯示問題。 – Cerad 2012-02-20 15:31:25

+0

有一點......對於'你有太多的對象和事情發生在我可憐的大腦後面' – 2017-09-07 15:29:16

回答

0

我記得這個來自doctrine1,不知道這裏是否適用同樣適用,在doctrine1刷新時只刷新第一個直接對象,處理關係和你需要添加第二個參數deep = true來處理所有相關的對象,你可以嘗試尋找那樣的東西。

+0

'EntityManager-> refresh()'[方法here]沒有第二個參數(https:// github .com/doctrine/doctrine2/blob/master/lib/Doctrine/ORM/EntityManager.php#L666) – ManseUK 2013-06-12 16:59:49

+0

確定事情有點令我困惑,但爲什麼你沒有'$ this-> em-> refresh ($ this-> basket);'refresh'函數內 – 2013-06-12 17:40:31

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

我會去有兩個猜測:

  • 您應該使用級聯註解的類,允許級聯「堅持」,或許級聯「刷新」了。如documentation所述。喜歡的東西:

    @ORM \ OneToOne(targetEntity = 「實體\訂單」,的mappedBy = 「菜籃子」,級聯= { 「堅持」, 「刪除」, 「刷新」})

  • 你缺少清新之前在Declinations上使用persist()flush()。如果你不是級聯的,你需要在你想保留的每個對象上調用它們,然後調用refresh()方法。

(它總是一個好主意,也檢查你的代理服務器的創建和工作的所有的權利,當你使用嵌套對象的工作)