2012-03-08 65 views
4

是否有可能有兩個存儲庫爲同一個實體?學說許多存儲庫爲同一個實體

我嘗試類似的東西,但它不工作..

class PackageRepository extends EntityRepository 
{ 
    public function __construct($em, Mapping\ClassMetadata $class) 
    { 
     $cmf = $em->getMetadataFactory(); 
     $class = $cmf->getMetadataFor('Product'); 
     parent::__construct($em, $class); 
    } 
} 

任何想法?

回答

4

首先,你爲什麼要這麼做?

二,回答你的問題。你可以擁有儘可能多的存儲庫,只要你喜歡,它們就是簡單的類。

但是,您可以使用@Repository註釋(或YAML或XML,無論)只將一個類與實體類關聯起來。所有的映射數據都存儲在EntityManager中。 EntityManager將知道只有一個存儲庫類與實體類鏈接,如果你試圖用$entity->getReposiotry()或類似的方法得到它,它將只返回鏈接的類。

但是沒有任何東西可以阻止您創建自己的類,這些類會執行一些查詢,並直接調用它們,而不依賴於EntityManagers存儲庫映射。

+0

謝謝您的回答。我需要它,因爲我有一個實體,實際上代表兩個類。我沒有找到如何用繼承來解決這個問題。這是另一個問題,這裏解釋這裏:http://stackoverflow.com/questions/9501755/doctrine-persist-php-class-which-inherit-doctrine-entity – Charles 2012-03-14 07:38:35

+1

我真的想知道,在一個存儲庫具體到管理方法和操作,以及特定於前端方法和操作的存儲庫,管理同一個實體。太糟糕了,沒有辦法根據Access路徑指定可以使用哪個Repository。 – RedactedProfile 2014-08-18 19:06:44

1

我找到了解決方案。 PHP中的東西叫做Trait

例子:

class UserRepository extends EntityRepository { 

    public function adminQuery1(); 
    public function adminQuery2(); 
    public function adminQuery3(); 
    public function adminQuery4(); 
    public function adminQuery5(); 
    public function adminQuery6();  

    public function frontEndQuery1(); 
    public function frontEndQuery2(); 
    public function frontEndQuery3(); 
    public function frontEndQuery4(); 
    public function frontEndQuery5(); 
    public function frontEndQuery6();  
} 

現在不斷有不同的具體的查詢部分和你的資料庫會很快變得混亂和太長時間。 你可以

  1. 創建相互繼承遺產或
  2. 使用性狀

例子下面多個倉庫:

Trait AdminQuery { 
    public function adminQuery1(); 
    public function adminQuery2(); 
    public function adminQuery3(); 
    public function adminQuery4(); 
    public function adminQuery5(); 
    public function adminQuery6();  
} 

Trait FrontEndQuery { 
    public function adminQuery1(); 
    public function adminQuery2(); 
    public function adminQuery3(); 
    public function adminQuery4(); 
    public function adminQuery5(); 
    public function adminQuery6();  
} 

的實際存儲庫類。

class UserRepository extends EntityRepository { 
    use AdminQuery; 
    use FrontEndQuery;  
} 

這樣做的好處是,關鍵字this將把其中的Trait使用意味着你有機會獲得的EntityRepository

所有功能終於找到了用例Trait上下文。

0

我也遇到了同樣的問題,當兩個Symfony捆綁包使用相同的實體,但對於每個捆綁包查詢不同時,所以我也決定爲每個捆綁包創建單獨的存儲庫。對於學說2該解決方案可以是:

  1. 「@Repository註解」可以用來點默認存儲庫或只是避免它。
  2. 創建通常的repository class,例如, 「MyEntityRepository」。
  3. 在代碼:

    $myEntityRepo = new MyEntityRepository($entityManager, $entityManager->getClassMetadata('AppBundle:MyEntity'));