2012-12-06 46 views
1

我有一個實體需要返回另一個實體的實例 - 存儲的記錄或新的實例(如果沒有存儲的話)。在實體內創建並維持一個新的實體實例

<?php 

/** 
* @Entity 
*/ 
class User { 
    /** 
    * @OneToOne(targetEntity="Basket") 
    * @JoinColumn(nullable=true) 
    */ 
    protected $activeBasket; 

    public function getActiveBasket() { 
     if (!isset($this->activeBasket)) { 
      $this->activeBasket = new Basket($this); 
      // $em->persist($this->activeBasket); 
      // $em->flush(); 
     } 
     return $this->activeBasket; 
    } 
} 

我的問題是,我沒有一個EntityManager用於堅持這個新的籃子(顯然不希望在模型中)。我不確定最好的方式來做到這一點。我確實希望能夠致電$user->getActiveBasket()並檢索一個籃子,無論它是以前創建的還是新的籃子。

感覺這應該是一個常見問題,或者有更好的方法來構造這個(我希望有一種方法可以將EntityRepository或其他東西掛鉤)。我怎樣才能做到這一點?

+0

[cascade persist]怎麼樣(http://docs.doctrine-project.org/zh/2.0.x/reference/working-with-associations.html#transitive-persistence-cascade-operations)?這看起來會解決你的問題。 – Carsten

回答

1

當它爲空或未設置時,我不會返回new Basket()。模型(實體)只應用於設置和獲取其屬性。

$user->getActiveBasket()返回null應該是其他地方的邏輯 - 在控制器或實體的reporitory對象...

所以我會提出public function getActiveBasket() { ... }逼到public function getActiveBasket() { return $this->activeBasket; },並在控制器的地方,我會做:

$if(!$user->getActiveBasket()) { 
    $user->setActiveBasket(new Basket($user)); 
    $this->_em->persist($user); 
    $this->_em->flush(); 
} 
// now do something with that activeBasket... 
+0

謝謝,我希望能在一個地方做到這一點,但這不是一個巨大的妥協。乾杯! – Ross

+0

不客氣! – shadyyx

相關問題