Подтвердить что ты не робот

Ожидайте какой-либо результат от построителя запросов доктрины, что я должен использовать?

У меня есть этот метод:

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

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

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

От него я ожидаю найти месяц или 0 месяцев. Я использую этот метод таким образом в моих контроллерах:

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

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

Я пробовал это с помощью getSingleResult(), и все было идеально, пока я не наткнулся на случай, когда ни один месяц не был найден, и все пошло очень плохо!

Затем я попытался с getResult(), но он возвращает массив, а затем

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

называется вызываемым на не-объекте и фиксировать его, я должен использовать всюду

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

Есть ли более элегантный способ достичь этого без необходимости добавлять ненужный индекс [0] во всем мире?

4b9b3361

Ответ 1

Если вы используете getSingleResult, Doctrine выбрасывает \Doctrine\ORM\NoResultException, который вы можете поймать и обработать. Если вы хотите поймать это прямо в репозитории, я бы предложил:

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();
    }
}

Не забудьте добавить use Your\Namespace\Month;, иначе это не удастся, потому что он не может найти класс Month!

Конечно, вы также должны сохранить сущность, если она новая. Вы можете расширить блок catch следующим образом:

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

    return $month;
}

Вы также можете поймать исключение в своем контроллере, сделав его более прозрачным. Но это зависит от ваших случаев использования и лучше всего решает сам.