期待学说查询构建器的一个或没有结果,我应该使用什么



我有此方法:

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

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

相关内容

  • 没有找到相关文章

最新更新