symfony 从一个规则查询生成器中期待一个结果或没有结果,我应该使用什么?

okxuctiv  于 2023-02-09  发布在  其他
关注(0)|答案(2)|浏览(100)

我有这个方法:

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]索引?

n6lpvg4x

n6lpvg4x1#

此外,在Doctrine 2.1中,您可以使用“getOneOrNullResult”
http://doctrine-orm.readthedocs.org/en/latest/reference/dql-doctrine-query-language.html#query-result-formats

6ss1mwsb

6ss1mwsb2#

如果您使用getSingleResult,Doctrine会抛出一个\Doctrine\ORM\NoResultException,您可以捕获并处理它。如果您想直接在Repository中捕获它,我建议:

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->persist($month);

    return $month;
}

你也可以在你的控制器中捕获异常,使它更透明,但是这取决于你的用例,最好是自己解决

相关问题