为同一实体定义多个存储库

问题描述 投票:0回答:4

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

我尝试了类似的方法,但它不起作用..

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

有什么想法吗?

php doctrine repository entity
4个回答
5
投票

首先,你为什么要这样做?

第二,回答你的问题。您可以拥有任意数量的存储库来处理相同的实体,毕竟它们只是简单的类。

但是您只能使用 @Repository 注释(或 YAML、XML 等)将一个类与实体类链接。所有映射数据都存储在 EntityManager 中。 EntityManager 将知道只有一个存储库类与实体类链接,如果您尝试使用

$entity->getReposiotry()
或类似的方法获取它,它将仅返回链接的类。

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


2
投票

我也遇到了同样的问题,当两个 Symfony 包使用相同的实体,但每个包的查询不同时,所以我还决定为每个包创建单独的存储库。对于原则 2,解决方案可以是:

  1. “@Repository 注解”可用于指向默认存储库或只是避免它。
  2. 创建常用的存储库类,例如“我的实体存储库”。
  3. 代码中:

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


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 中自动连接的自定义实体存储库,您只需要:

<?php

use Doctrine\ORM\EntityManagerInterface;
use Doctrine\ORM\EntityRepository;

class MyEntityRepository extends EntityRepository
{
    public function __construct(EntityManagerInterface $em)
    {
        $class = $em->getClassMetadata(MyEntity::class);
        parent::__construct($em, $class);
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.