2013-02-18 65 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。這一切都取決於你需要什麼,但這是減少開銷的兩種方法。