Ожидайте какой-либо результат от построителя запросов доктрины, что я должен использовать?
У меня есть этот метод:
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] во всем мире?
Ответы
Ответ 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;
}
Вы также можете поймать исключение в своем контроллере, сделав его более прозрачным. Но это зависит от ваших случаев использования и лучше всего решает сам.
Ответ 2
Кроме того, в Doctrine 2.1 вы можете использовать 'getOneOrNullResult'
http://doctrine-orm.readthedocs.org/en/latest/reference/dql-doctrine-query-language.html#query-result-formats