web-dev-qa-db-fra.com

Attendez-vous à un ou aucun résultat d'un générateur de requête doctrine, que dois-je utiliser?

J'ai cette méthode:

public function getMonth ($month_name)
    {
        $q = $this->createQueryBuilder('m');

        $q->select('m')
            ->where('m.name = :name')    
            ->setParameter('name', $month_name);

        return $q->getQuery()->getResult();
    }

J'espère en trouver un mois ou 0 mois. J'utilise cette méthode de cette manière dans mes contrôleurs:

$month = $em->getRepository('EMExpensesBundle:Month')
                ->getMonth($this->findMonth());

            $month->setSpended($item->getPrice());

J'ai essayé avec getSingleResult() et tout était parfait jusqu'à ce que je tombe sur un cas où aucun mois n'a été trouvé et tout a échoué vraiment mal!

Ensuite, j'ai essayé avec getResult(), mais il retourne un tableau puis

$month->setSpended($item->getPrice());

est appelé sur un non-objet et pour le réparer, je devrais l'utiliser partout

$month[0]->setSpended($item->getPrice());

Existe-t-il un moyen plus élégant d'y parvenir sans avoir besoin d'ajouter un index [0] inutile partout?

28
Faery

Si vous utilisez getSingleResult, Doctrine lance un \Doctrine\ORM\NoResultException, que vous pouvez attraper et manipuler. Si vous voulez attraper cela directement dans le référentiel, je suggère:

public function getMonth ($month_name)
{
    $q = $this->createQueryBuilder('m');

    $q->select('m')
        ->where('m.name = :name')    
        ->setParameter('name', $month_name);

    try {
        return $q->getQuery()->getResult(); 
        }
    catch(\Doctrine\ORM\NoResultException $e) {
        return new Month();
    }
}

N'oubliez pas d'ajouter un use Your\Namespace\Month; ou cela échouera car il ne trouvera pas la classe Month!

Bien sûr, vous devez également conserver l'entité au cas où elle serait nouvelle. Vous pouvez étendre le bloc catch comme ceci:

catch(\Doctrine\ORM\NoResultException $e) {
    $month = new Month();
    $this->_em->perist($month);

    return $month;
}

Vous pouvez également intercepter l'exception dans votre contrôleur, le rendant plus transparent. Mais cela dépend de vos cas d'utilisation et est mieux résolu par vous-même

33
Sgoettschkes
64
olegkhuss