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;
    }
}