与其返回null并检查是否可以创建一个扩展查询构建器的TypeNQueryBuilder
,以便它保持接口,但返回具有您需要的空/空结果的自定义TypeNQuery
。
的Acme \原则\ TypeNQuery
use Doctrine\ORM\AbstractQuery;
class TypeNQuery extends AbstractQuery
{
/**
* Override __construct so it doesn't require EntityManager
*/
public function __construct()
{
}
/**
* {@inheritdoc}
*/
public function getResult()
{
return [];
}
/**
* {@inheritdoc}
*/
public function getOneOrNullResult($hydrationMode = null)
{
return null;
}
/**
* {@inheritdoc}
*/
public function getSingleScalarResult()
{
return 0;
}
//.. add as necessary
// getArrayResult()
// getScalarResult()
// getSingleResult()
}
的Acme \原则\ TypeNQueryBuilder
user Doctrine\ORM\QueryBuilder;
class TypeNQueryBuilder extends QueryBuilder
{
/**
* Override getQuery() so it returns your TypeNQuery
*/
public function getQuery()
{
return new TypeNQuery();
}
}
然后在你getBaseQueryBuilder
呼叫时,可以添加条款或退回您TypeNQueryBuilder
根据类型提供。
protected function getBaseQueryBuilder($type)
{
$queryBuilder = $this->em->createQueryBuilder();
switch ($type) {
case self::TYPE_1:
$queryBuilder
->yadaYadaYada(....)
;
break;
case self::TYPE_2:
$queryBuilder
->yadaYadaYada(....)
;
break;
case self::TYPE_N:
return new TypeNQueryBuilder($this->em);
}
return $queryBuilder;
}
随着接口为你只是能够使用相同的..
$this
->getBaseQueryBuilder($type)
->andWhere(...)
->addOrderBy(...)
->getQuery()
->getOneOrNullResult();
..并依据给定它要么正确地构建查询或只是在辍学的类型最后一分钟,并返回您的null
结果。
我喜欢这个解决方案。它甚至可以被扩展来覆盖'andWhere()','orderBy()'等,以使这些操作更便宜。我会尽力实现这一点,看看它是如何发展的。 – jlh
我认为像'andWhere','innerJoin'等大多数方法都会做一些事情,然后调用'add',这样你就可以覆盖那个只返回'$ this'并切出很多工作。 – qooplmao