2012-03-08 11 views
4

同じエンティティに対して2つのリポジトリを持つことは可能ですか?同じエンティティのDoctrineリポジトリ

任意のアイデア

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

..私はそのような何かをしようと、それは動作しませんか?

答えて

4

まず、なぜあなたはそれをしたいですか?

第2に、質問にお答えください。あなたは、同じエンティティを好きなだけ多くのリポジトリで扱うことができますが、結局のところ単純なクラスです。

しかし、@Repositoryアノテーション(またはYAML、XMLなど)を使用して、エンティティクラスと1つのクラスのみをリンクできます。すべてのマッピングデータは、EntityManagerに格納されます。 EntityManagerは、1つのリポジトリクラスのみがエンティティクラスにリンクされていることを認識します。$entity->getReposiotry()などで取得しようとすると、リンクされたクラスのみが返されます。

しかし、EntityManagersリポジトリマッピングに頼ることなく、いくつかのクエリを実行して直接明示的に呼び出す独自のクラスを作成するのを止めることはできません。

+0

感謝。実際には2つのクラスを表すエンティティがあるため、必要です。私は継承でこの問題を解決する方法を見つけませんでした。これは別の問題です。ここで説明します:http://stackoverflow.com/questions/9501755/doctrine-persist-php-class-which-inherit-doctrineentity – Charles

+1

私は実際に知りたいのですが、リポジトリの管理メソッドと操作、および同じエンティティを管理するフロントエンドのメソッドと操作に固有のリポジ​​トリです。あまりにも悪いので、アクセスパスに基づいてどのリポジトリを使用できるかを決める方法はありません。 – RedactedProfile

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();  
} 

今異なる特定のクエリ部分と一緒に行くの維持とあなたのリポジトリが急速に混乱と長くなりすぎます。 あなたが

例以下は、特色同士のOR

  • 使用を継承し、複数のリポジトリを作成することができます。

    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;  
    } 
    

    これの美しさは、キーワードthisTraitは、あなたが最後にTraitのためのユースケースを発見したEntityRepository

    のすべての機能へのアクセス権を持っているという意味で使用されたコンテキストを参照してくださいということです。

  • 0

    2つのSymfonyバンドルが同じエンティティで動作しても、同じバンドルでクエリが異なるので、同じ問題が発生しています。そのため、バンドルごとに別々のリポジトリを作成することにしました。教義2のためのソリューションを使用できます

    1. 「@Repository注釈」ポイントのデフォルトのリポジトリに使用されるか、またはそれを避けることができます。
    2. 通常作成:repository class "MyEntityRepository"。コードで
    3. :あなたの答えのための

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

    関連する問題