我有这个问题,我想创建“智能”标准。假设有一个模型为 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 会更合适。
您可以使用自定义方法扩展 QueryBuilder,但通过覆盖createQueryBuilder存储库的方法会产生一些开销:
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)
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)
$qb = $em->getRepository('Books')->createQueryBuilder('b')
->whereAuthorIsAlive();
Run Code Online (Sandbox Code Playgroud)