Doctrine 基于现有querybuilder方法向querybuilder添加自定义方法的最佳实践是什么?
在下面的代码示例中,我使用了一个自定义存储库方法,我必须像这样调用它Doctrine 基于现有querybuilder方法向querybuilder添加自定义方法的最佳实践是什么?,doctrine,query-builder,Doctrine,Query Builder,在下面的代码示例中,我使用了一个自定义存储库方法,我必须像这样调用它$queryBuilder=$this->addFilterByVisible($queryBuilder)但我想这样称呼它$queryBuilder->andWhere(…)->addFilterByVisible() 这可能吗?在不处理AST和添加自定义dql函数(如此处所述)的情况下,这是可能的吗 简单地扩展querybuilder并重写createQueryBuilder方法的解决方案是什么 这是当前的“完整”示例 供参
$queryBuilder=$this->addFilterByVisible($queryBuilder)代码>但我想这样称呼它$queryBuilder->andWhere(…)->addFilterByVisible()
这可能吗?在不处理AST和添加自定义dql函数(如此处所述)的情况下,这是可能的吗
简单地扩展querybuilder并重写createQueryBuilder
方法的解决方案是什么
这是当前的“完整”示例
供参考:如何创建自定义querybuilder
您是否尝试过将QueryBuilder扩展到PersonQueryBuilder,向其中添加方法,然后在PersonRepository中,重写createQueryBuilder()以返回PersonQueryBuilder而不是默认的PersonQueryBuilder?不确定是否有效,但可能值得一试?但它只适用于PersonRepository。@gingerCodeNinja谢谢你的回答,已经这么做了。我在寻找做这件事的“正确方法”/“最佳实践”。看起来简单地扩展querybuilder并添加方法就是“正确的方法”。对不起,我错过了你说你已经考虑过的那句话!:)我相信其他人会有更好的答案。另一方面,我们试图让我们的存储库非常简单——尽可能不扩展默认EntityRepository,并在其上添加一层“管理器”,将EntityRepository用作服务。因此,有几个getter/finder的PersonManager用逻辑包装EntityRepository->createQueryBuilder。每个特定类型查询的管理器,因此更符合S.O.L.I.D,更容易进行单元测试。
class PersonRepository extends ServiceEntityRepository
{
protected function addFilterByVisible(QueryBuilder $queryBuilder): QueryBuilder
{
$queryBuilder
->andWhere('person_group.visible = :group_is_visible')
->andWhere('person.visible = :person_is_visible')
->setParameter('group_is_visible', true)
->setParameter('person_is_visible', true)
;
return $queryBuilder;
}
protected function queryAllSorted()
{
$queryBuilder = $this->createQueryBuilder('person');
$queryBuilder
->innerjoin('person.group', 'person_group')
->addSelect('person_group')
;
$queryBuilder = $this->addFilterByVisible($queryBuilder);
return $queryBuilder;
}
}