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

a を追加することを忘れないでください。そうしuse 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 に答える