我有此方法:
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());
有没有更优雅的方法来实现这一目标,而无需在各处添加不必要的索引?
此外,在学说2.1中,您可以使用'getoneornullresult'
http://doctrine-orm.readthedocs.org/en/latest/reference/dql-doctrine-query-language.html#query-result-formats
如果使用getSingleResult
,则可以将DoctrineORMNoResultException
抛出,您可以捕获并处理它。如果您想直接在存储库中捕获它,我建议:
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(DoctrineORMNoResultException $e) {
return new Month();
}
}
不要忘记添加use YourNamespaceMonth;
,否则会失败,因为它找不到月份!
当然,您还必须坚持实体,以防它是一个新的实体。您可以扩展捕获块以使其看起来这样:
catch(DoctrineORMNoResultException $e) {
$month = new Month();
$this->_em->persist($month);
return $month;
}
您还可以在控制器中捕获例外,从而使其更透明。但这取决于您的用例,最好由您自己解决