Doctrine2 QueryBuilder, which obviously doesn't match anything

I am using Doctrine 2.4, and I have an abstract base class containing the following method:

protected function getBaseQueryBuilder($type) {
    switch ($type) {
        case self::TYPE_1;
            return $this->em->createQueryBuilder()->...lots of clauses...;
        case self::TYPE_2;
            return $this->em->createQueryBuilder()->...lots of clauses...;
        /* many more types... */
        case self::TYPE_N;
            return /* want to return a query builder for the empty set */
    }
}

There are several subclasses that inherit this base class, and each of them calls this method from several places. They then expand the returned query servers with additional class clauses before executing them. However, in the case of the TYPE_Nstring should never match.

One solution is, of course, returning null for $type == TYPE_Nand checking each caller for null, and then not doing anything if that is the case. But it would be much nicer if I could return a query builder that would never match anything, and for which the query would never get into the database. This would simplify many caller sites.

Is there any way to do this?

+4
source share
2 answers

, null , TypeNQueryBuilder, , , TypeNQuery, / , .

Acme\Doctrine\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\Doctrine\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.

+3

- ? , QueryBuilder, null , getResult()...

, , , getBaseQueryBuilder . , - :

protected function getBaseQueryBuilder($type) {
    switch ($type) {
        case self::TYPE_1;
            return $this->em->createQueryBuilder()->...lots of clauses...;
        case self::TYPE_2;
            return $this->em->createQueryBuilder()->...lots of clauses...;
        case self::TYPE_N;
            return null;
    }
}

protected function getResultFromBaseQueryBuilder() {
    $type = $this->getType(); // get your type
    $queryBuilder = $this->getBaseQueryBuilder($type);
    if( $queryBuilder === null ){
        return /* empty result set so for example null, [] or new ArrayCollection(); */
    }
    return $queryBuilder->getResult();
}

:

protected function getBaseQueryBuilder($type) {
    switch ($type) {
        case self::TYPE_1;
            return $this->em->createQueryBuilder()->...lots of clauses...;
        case self::TYPE_2;
            return $this->em->createQueryBuilder()->...lots of clauses...;
    }
}

protected function getResultFromBaseQueryBuilder() {
    $type = $this->getType(); // get your type
    if( $type === self:TYPE_N ){
        return /* empty result set so for example null, [] or new ArrayCollection(); */
    }
    $queryBuilder = $this->getBaseQueryBuilder($type);
    return $queryBuilder->getResult();
}

, , getBaseQueryBuilder, , , . ( getResult getResultFromBaseQueryBuilder, , ).

+2

Source: https://habr.com/ru/post/1654527/


All Articles