與其返回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