web-dev-qa-db-ja.com

doctrineクエリビルダーからの結果が1つまたはまったくないことを期待します。何を使用すればよいですか?

私はこの方法を持っています:

_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]インデックスをどこにでも追加することなく、これを実現するよりエレガントな方法はありますか?

28
Faery

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

use Your\Namespace\Month;を追加することを忘れないでください。そうしないと、Monthクラスが見つからないため失敗します。

もちろん、エンティティが新しい場合に備えて、エンティティを永続化する必要もあります。 catchブロックは次のように拡張できます。

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

    return $month;
}

コントローラーで例外をキャッチして、より透明にすることもできます。しかし、これはユースケースに依存し、自分で解決するのが最善です

33
Sgoettschkes

さらに、Doctrine 2.1では、 'getOneOrNullResult'を使用できます

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

64
olegkhuss