2012-07-13 17 views
5

それぞれ質問と与えられた答えであるtestQuestionオブジェクトの数を保持するテストオブジェクトを持つバンドルを設定しました。 )。私は小枝から、テストオブジェクトからの情報を取得して、そこにいくつの質問があり、どれだけ答えられたのかを知りたいと思っています。Symfony2/Doctrineエンティティ内の関連するオブジェクトの数を格納する方法

これをdbから取り除くためのクエリを作成しました。テストエンティティでは、2つの新しいプロパティを作成して、質問数と回答数を格納しました。クエリが存在するTestRepositoryを作成しました。 Testオブジェクトはオブジェクトに値が設定されているかどうかをチェックし、必要であればロードしません。常にこの情報が必要なわけではありません。

しかし、リポジトリコードをテストオブジェクトにリンクする方法については、repo関数を呼び出して、関連するテストオブジェクトに値を保存するためにrepo関数を呼び出すことができません。

アクメ/ Quizbundle /試験/ test.phpを

namespace Acme\QuizBundle\Entity; 

use Doctrine\ORM\Mapping as ORM; 
use Acme\QuizBundle\Entity\TestRepository; 

/** 
* @ORM\Entity(repositoryClass="Acme\QuizBundle\Entity\TestRepository") 
* @ORM\Table(name="test") 
*/ 
class Test { 
protected $numQuestions = null; 
protected $numQuestionsAnswered = null; 

public function getNumQuestionsAnswered() { 
    if (is_null($this->numQuestionsAnswered)) { 
     $repository = $this->getEntityManager()->getRepository('\AcmeQuizBundle\Test'); 
     $values = $repository->calculateNumQuestions(); 
    } 
    return $this->numQuestionsAnswered; 
} 

アクメ/ Quizbundle /試験/ TestRepository.php(getNumQuestionsためのマッチング方法は、(あります))

namespace Acme\QuizBundle\Entity; 

use Doctrine\ORM\EntityRepository; 

class TestRepository extends EntityRepository { 

private function calculateNumQuestions() { 

    $qb = $this->getEntityManager() 
       ->createQueryBuilder(); 

    $query = $this->getEntityManager()->createQueryBuilder() 
         ->select('COUNT(id)') 
      ->from('testquestion', 'tq') 
      ->where('tq.test_id = :id') 
      ->setParameter('id', $this->getId()) 
      ->getQuery(); 

    $result = $query->getSingleScalarResult(); 
    var_dump($result); 
    } 

答えて

12

多数ありこの結果を得るために使用できるさまざまなパターンのうち、最も単純なのは単にaggregate fieldです。これは、情報が必要になるたびに計算するのではなく、変更後の情報を保管します。

代わりに、TestとTestQuestionのリポジトリ間に1対多の関連付けを作成することができます(既に存在しないと仮定して)、twigテンプレートでは単に{{ testEntity.questionsAnswered.count() }}を使用することができます。これを"extra-lazy" associationにして、COUNT SQL文を使用して回答のある質問の数を調べます(デフォルトでは、関連付けを列挙しようとすると実際に質問のエンティティが取得されます)。

最後に、私が非常にお勧めしない方法がありますが、状況によっては必要な場合もあります。あなたの質問で使用するアプローチと同様に、リポジトリの質問数を取得しますが、Symfonyの単純なモデルアプローチを維持するために、エンティティ内部からクエリを開始しません(エンティティはエンティティマネージャ/リポジトリ)。

代わりに、テストエンティティのインスタンスがロードされるたびにDoctrine EventListenerを通知することができます(here、postLoadイベントを使用)。次に、リポジトリメソッドを呼び出してそこからエンティティを設定します。

+0

ありがとう、本当に助かりました –

+0

注意!余分な怠惰な関連付けでは、組み込みの小枝** 'lenght'の代わりに' Collection#count() 'コール**を使わなければなりません。 **正しい方法は、SQLのカウントを使用します:** '{{testEntity.questionsAnswered.count}}'( 'length'はメモリ内の行を取得します!) –

+0

@Sanya_Zolを修正していただきありがとうございます。 –

関連する問題