2012-02-20 71 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()方法。

(它总是一个好主意,也检查你的代理服务器的创建和工作的所有的权利,当你使用嵌套对象的工作)