我正在使用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
类还是其他类?
答案 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定义