2013-02-18 67 views
0

下面表中的字段是我(简化)范畴实体:访问加入Doctrine2

/** 
* @ORM\Entity 
*/ 
class Category 
{  
    /** 
    * @ORM\Id 
    * @ORM\Column(type="integer") 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    protected $id = null; 

    /** 
    * @ORM\ManyToOne(targetEntity="Category", inversedBy="children", fetch="EAGER") 
    */ 
    protected $parent = null; 

    /** 
    * @ORM\OneToMany(targetEntity="Category", mappedBy="parent", fetch="LAZY") 
    * @ORM\JoinTable(name="category_tree", 
    *  joinColumns={@ORM\JoinColumn(name="parent_id", referencedColumnName="id")}, 
    *  inverseJoinColumns={@ORM\JoinColumn(name="child_id", referencedColumnName="id")} 
    *) 
    */ 
    protected $children; 
} 

我可以写一个DQL查询它会给我一个结果和对每个类别:

  • 其ID
  • 其子女的IDS

在SQL它非常简单,当然是一个数组,但加入标签在学说中似乎是透明的。

+0

这在DQL中不起作用。在DQL中,您最终可以从http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/dql-doctrine-query-language.html#joins – Ocramius 2013-02-18 14:13:58

+0

中获取 - 加入关联项我已经在做fetch-join了,但是因为我只需要连接主表的ID,所以我愿意留出一大笔开销。我将继续使用取指连接。谢谢。 – Ninj 2013-02-18 14:44:10

回答

0

如果你只需要引用,有一个方便的getReference()方法中,使用这样的:

$item = $this->em->getReference('Entity\Item', $id); 

或者,你可以设置关联实体EXTRA_LAZY。这一切都取决于你需要什么,但这是减少开销的两种方法。