如何从两个实体存储库中清除类似的教义功能?

时间:2018-08-12 06:53:48

标签: php symfony doctrine-orm symfony4

我正在使用Symfony 4。

namespace App\Repository;

use ...

class CountryRepository extends ServiceEntityRepository
{
    public function __construct(RegistryInterface $registry)
    {
        parent::__construct($registry, Country::class);
    }

    ...

    public function deleteMultipleByIds(array $ids): void
    {
        $builder = $this->createQueryBuilder('l');
        $builder->delete()
            ->where('l.id IN(:ids)')
            ->setParameter(
                ':ids',
                $ids,
                Connection::PARAM_INT_ARRAY
            );

        $query = $builder->getQuery();
        $query->execute();
    }

CountryI18nRepository类中存在相同的方法。

我希望只有一个这样的函数,它将只使用正确的实体(Country v CountryI18n)。

如何以及在何处创建新课程?该类是ServiceEntitiyRepository类还是其他类?

2 个答案:

答案 0 :(得分:1)

如果您的问题与重复有关,则可以制作一个GenericRepo(不一定是学说存储库;请选择一个更好的名称),然后将其注入并在需要的地方使用。

类似

class GenericRepo
{
  public function deleteMultipleByIds(QueryBuilder $qb, string $rootAlias, array $ids): void
  {
    $qb->delete()
      ->where(sprintf('%s.id IN(:ids)', $rootAlias))
      ->setParameter(':ids', $ids, Connection::PARAM_INT_ARRAY);

    $qb->getQuery()->execute();
  }
}

在您的CountryI18nRepository

class CountryI18nRepository
{
  private $genericRepo;

  public function __construct(GenericRepo $genericRepo)
  {
    $this->genericRepo = $genericRepo;
  }

  public function deleteMultipleByIds(array $ids): void
  {
    $builder = $this->createQueryBuilder('l');

    $this-> genericRepo->deleteMultipleByIds($builder, 'l', $ids);
  }
}

您也可以从GenericRepo开始扩展,但是由于PHP仅支持单一继承,因此(至少在我看来)使用如上所述的组合更好。

免责声明

我没有测试此代码,因此可能需要进行一些调整。顺时针显示的概念是有效的。

答案 1 :(得分:1)

使用deleteMultipleByIds创建抽象存储库,例如:

abstract class BaseCountryRepository extends ServiceEntityRepository

并扩展它而不是其他CountryRepositories中的ServiceEntityRepository

class CountryRepository extends BaseCountryRepository

class CountryI18nRepository extends BaseCountryRepository

您可以从这些类中删除deleteMultipleByIds定义