2012-12-06 45 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

相关问题