Doctrine 同一实体的多个存储库

Doctrine 同一实体的多个存储库,doctrine,repository,entity,Doctrine,Repository,Entity,同一实体是否可能有两个存储库 我试过那样的方法,但不管用 class PackageRepository extends EntityRepository { public function __construct($em, Mapping\ClassMetadata $class) { $cmf = $em->getMetadataFactory(); $class = $cmf->getMetadataFor('Product');

同一实体是否可能有两个存储库

我试过那样的方法,但不管用

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

有什么想法吗?

首先,你为什么要这么做

第二,回答你的问题。您可以有任意多个存储库使用相同的实体,毕竟它们只是简单的类

但您只能使用@Repository注释(或YAML或XML,无论什么)将一个类与实体类链接起来。所有映射数据都存储在EntityManager中。EntityManager将知道只有一个存储库类与实体类链接,如果您尝试使用
$entity->getReposiotry()
或类似方法获取它,它将只返回链接的类


但是没有什么可以阻止您创建自己的类,这些类执行一些查询并直接、显式地调用它们,而不依赖EntityManager存储库映射。

我找到了解决方案。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();     
}
现在继续使用不同的特定查询部分,您的存储库很快就会变得混乱和过长。 你可以

  • 创建相互继承的多个存储库或
  • 使用特征
  • 示例如下:

    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的一个用例,我也遇到了同样的问题,当两个Symfony bundle使用相同的实体时,但是每个bundle的查询都不同,所以我还决定为每个bundle创建单独的存储库。对于原则2,解决方案可以是:

  • “@Repository annotation”可以用来指向默认存储库,也可以直接避开它
  • 创建常规,例如“MyEntityRepository”
  • 代码:

    $myEntityRepo=newmyentityrepository($entityManager,$entityManager->getClassMetadata('AppBundle:MyEntity')


  • 谢谢你的回答。我需要它,因为我有一个实体,它实际上代表两个类。我没有发现如何用继承来解决这个问题。这里解释的是另一个问题:我实际上想知道,在管理同一实体的特定于管理方法和操作的存储库和特定于前端方法和操作的存储库的情况下。太糟糕了,无法根据访问路径指定可以使用哪个存储库。“但是没有什么可以阻止您创建自己的类,这些类执行一些查询,并直接、显式地调用它们,而不依赖EntityManager存储库映射。”您有这样做的示例吗?以及引用
    $this->getEntityManager()->createNativeQuery()
    从特征级别?您的IDE将不知道EM。