28

我有这个方法:

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

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

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

我希望从中找到 1 个月或 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] 索引?

4

2 回答 2

66

此外,在 Doctrine 2.1 中,您可以使用“getOneOrNullResult”

http://doctrine-orm.readthedocs.org/en/latest/reference/dql-doctrine-query-language.html#query-result-formats

于 2012-10-29T10:13:54.333 回答
33

如果你使用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();
    }
}

不要忘记添加 ause Your\Namespace\Month;否则这将失败,因为它找不到 Month 类!

当然,如果它是新实体,您还必须保留实体。您可以像这样扩展 catch 块:

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

    return $month;
}

您还可以在控制器中捕获异常,使其更加透明。但这取决于您的用例,最好由您自己解决

于 2012-10-29T09:52:01.297 回答