Symfony中的一个实体,两个存储库

7

我想为一个实体使用2个仓库。

原因是:我有2个捆绑包,两个捆绑包都使用同一个实体。我希望将它们的功能分开。有时我需要在其中一个捆绑包中执行特定查询。

是否可以在一个捆绑包中拥有1个仓库,并在另一个捆绑包中拥有第二个仓库?也许这是错误的方法?

如果有人有想法,请建议。

谢谢!


如果您使用相同的实体,为什么不想使用相同的类存储库? - scoolnico
1
因为这是两个不同的功能。例如,如果我为汽车租赁制作一个网站,我有一个租赁捆绑包,有时我需要修理一些汽车。我有一个租赁捆绑包和另一个修理捆绑包,我想分开租赁查询和修理查询。 - lala
在你的代码库中创建两个方法。 - scoolnico
1
我已经在之前的消息中附上了一个例子。对于你来说,将所有查询都添加到同一个存储库中是一个好主意吗? - lala
所有依赖于相同实体的查询,是的。 - scoolnico
显示剩余2条评论
2个回答

2

2019更新

我会创建两个仓库。将所有方法添加到一个仓库中没有意义,只是因为它们共享实体。这样我们可能会在每个仓库中拥有30种方法。

第一个仓库

namespace App\Repository;

use App\Entity\Post;
use Doctrine\ORM\EntityManagerInterface;
use Doctrine\ORM\EntityRepository;

final class FrontendPostRepository
{
    /**
     * @var EntityRepository
     */
    private $repository;

    public function __construct(EntityManagerInterface $entityManager)
    {
        $this->repository = $entityManager->getRepository(Post::class);
    }

    /**
     * @return Post[]
     */
    public function getAll(): array
    {
        // ...
    }
}

...和第二个代码库

namespace App\Repository;

use App\Entity\Post;
use Doctrine\ORM\EntityManagerInterface;
use Doctrine\ORM\EntityRepository;

final class AdminPostRepository
{
    /**
     * @var EntityRepository
     */
    private $repository;

    public function __construct(EntityManagerInterface $entityManager)
    {
        $this->repository = $entityManager->getRepository(Post::class);
    }

    /**
     * @return Post[]
     */
    public function getUnpublished(): array
    {
        // ...
    }
}

您可以在如何在Symfony中使用Doctrine作为服务的存储库文章中了解更多关于此概念和原因的信息。

我的第一个想法是将这两个活动分开,因为我像你一样认为它们是两件不同的事情。 我曾尝试创建两个存储库,但在 Symfony 中,当您使用 ORM 注释 @ORM\Entity(repositoryClass = "")时,我认为您只能拥有一个存储库。 - lala
如果我理解正确的话,您建议在管理器中进行查询,而不是在存储库中进行查询? - lala
我不使用@ORM\Entity(repositoryClass="")的方法。个人而言,我会尝试使用这两个类,然后就能明确下一步该怎么做了。你已经在创建一个大型仓库之前停止了,所以这可能是你要走的路。 - Tomas Votruba

1
我不太确定这是否是一种良好的实践,但您可以创建一个没有链接实体的存储库(我的意思是,没有使用ORM注释)。
所以我只需在我的service.yml中创建此内容:
renting.metadata.car:
    class: Doctrine\ORM\Mapping\ClassMetadata
    arguments: [ %car% ]

而这个:

repair.repository.car:
    class: carRepository
    arguments: [@doctrine.orm.entity_manager, @renting.metadata.car]

那个起作用了


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接