2011-10-24 83 views
2

我開始在項目中使用Doctrine 2,可以從另一組繼承了「集團」的實體,具有下列模式庫之間的交流活動層次結構可以深入,我使用鏈接表「group_group」,使用這個模式:ancestor_id | descendant_id | depth通過實體及其Doctrine2

這個想法是任何組鏈接到它的所有祖先和後代,並且depth字段指示關係的距離,所以我不必通過使用許多SQL請求的父母或孩子迭代,一個人就可以獲得所有結果。 我試圖使用Doctrine的ManyToMany關係,但我無法讓它按depth字段排序,所以我使用實體的存儲庫來獲取相關的祖先和後代。

因爲實體無法訪問其存儲庫,我想知道是否有一個實體分派可以通過它的倉庫被監聽事件的方式,這樣,當一個實體試圖訪問它的祖先/後代,存儲庫可以響應?

感謝您的幫助。

回答

0

Entity不應該有一個具體的參照Repository但沒有什麼不對的定義Interface,有你的Repository實現這個接口,並將其注入到Entity

該解決方案Doctine 2 Restricting Associations with DQL

interface TreeInterface 
{ 
    public function findParent(); 
    public function findChildren(); 
} 

那麼你的實體的類似。

class Group 
{ 
    $repository; 

    setRepository(TreeInterface $repository) 
    { 
     $this->tree = $repository; 
    } 

    public function getParent() 
    { 
     return $this->repository->findParent($this); 
    } 

    public function getChildren() 
    { 
     return $this->repository->findChildren($this); 
    } 
} 

class GroupRepository extends EntityRepository implements TreeInterface 
{ 
    public function findParent(Group $group) 
    { 
     return //stuff 
    } 

    public function findChildren(Group $group) 
    { 
     return //stuff 
    } 
} 

然後你以這種方式使用它。

$group = $em->find('Group', 1); 
$group->setRepository($em->getRepository('Group')); 
$children = $group->getChildren(); 

爲了避免設置每個你得到一個孩子時的資料庫,我想借此看看eventmanager進行和餐後事件,看看你是否可以在負荷注入TreeInterface到實體。