2011-04-15 113 views
2

我试图用一个注释获取很多的关系,但只要我使用联接我将结束与以下数据:学说2个实体一对多关系

entities\Topic 
    id = 1   // integer 
    title = "example" // string 
    comments    // entities\Comment = oneToMany 
     id = 1     // integer 
     comment = "first comment" // string 
     topic      // entities\Topic = manyToOne 
      id = 1 // again.. 
      title = "example" 

为什么当我加入主题评论时,doctrine是否取得评论中的manyToOne关系?这是我的查询:

$this->em->createQueryBuilder() 
     ->from('Entities\Topic', 't') 
     ->select("t, c") 
     ->leftjoin("t.comments", 'c') 
     ->where('t.id = :id') 
     ->setParameter('id', 1) 
     ->getQuery()->getSingleResult(); 

不应该主题属性为空或至少是一个空的arrayCollection?

另一件事:

为什么我得到一个PersistentCollection早在评论时,我指定评论是一个ArrayCollection?在我可以循环访问之前,是否总是需要在PersistentCollection上使用解包?

回答

3

在第一位 - 它可能填充主题,因为它已经有了数据。如果数据尚未掌握,那么您可能在那里有代理实体。它永远不会为空,因为null将是错误的(评论确实有一个主题)。

至于ArrayCollection/PersistentCollection,您可以放心地忽略区别。我不知道实现细节,但基本上,EM在PersistentCollections中给出了一些东西,我假定它在管理集合中的实体方面发挥作用。如果你正在创建集合,你可以使用ArrayCollection。对不起,我不能在这里更具体,但底线是,你应该想想你从EM获得的任何PersistentCollections只是“一个集合”

+0

有没有办法关闭儿童的人口儿童?我将数据发送回客户端,因此我需要尽可能保持简约而不会失去灵活性。 – Dennis 2011-04-16 09:14:59

+0

说实话,我不确定最好的方法。我通常为要序列化的任何实体编写一个toArray()方法,因此我可以控制序列化并发送到客户端的树的深度。 – timdev 2011-04-16 16:26:49