Doctrine 中的自定义 QueryBuilder

Joh*_*ith 1 php doctrine-orm

我有这个问题,我想创建“智能”标准。假设有一个模型为 1 Author : n Books。

所以,而不是:

$qb = $em->getRepository('Books')->createQueryBuilder('b')
    ->join('b.author', 'a')
    ->where('a.dod is null')
    ->where('a.name = :name')
    ->setParameter('name', 'Mozart');
    ;
Run Code Online (Sandbox Code Playgroud)

...我想做类似的事情:

$qb = $em->getRepository('Books')->createQueryBuilder('b')
    ->whereAuthorIsAlive()
    ->whereAuthorName('Mozart');
Run Code Online (Sandbox Code Playgroud)

我知道创建自定义 EntityManager 的可能性,但这还不够。自定义 QueryBuider 会更合适。

Wul*_*ulf 5

您可以使用自定义方法扩展 QueryBuilder,但通过覆盖createQueryBuilder存储库的方法会产生一些开销:

  1. 扩展默认的 QueryBuilder 类:
class BookQueryBuilder extends \Doctrine\ORM\QueryBuilder 
{
    public function whereAuthorIsAlive(): self 
    {
        return $this->join($this->getRootAlias() . '.author', '_a')
            ->andWhere('_a.alive = true');
    }
}
Run Code Online (Sandbox Code Playgroud)
  1. 在您的存储库中,覆盖该createQueryBuilder方法:
class BookRepository extends EntityRepository
{
    public function createQueryBuilder($alias, $indexBy = null)
    {
        return (new BookQueryBuilder($this->_em))
            ->select($alias)
            ->from($this->_entityName, $alias, $indexBy);
    }
}
Run Code Online (Sandbox Code Playgroud)
  1. 使用新方法
$qb = $em->getRepository('Books')->createQueryBuilder('b')
    ->whereAuthorIsAlive();
Run Code Online (Sandbox Code Playgroud)