それぞれが質問と指定された回答 (または回答がない場合は 0) である多数の testQuestion オブジェクトを保持するテスト オブジェクトを持つバンドルをセットアップしました。小枝から、テストオブジェクトから情報を取得して、質問の数と回答済みの数を伝えたいと考えています。
これをデータベースから引き出すためのクエリを作成し、Test エンティティで、質問の数と回答数を格納する 2 つの新しいプロパティを作成しました。クエリが存在する TestRepository を作成しました。Test オブジェクトは、オブジェクトに値が設定されているかどうかを確認し、そうでない場合は必要に応じてロードします。この情報は常に必要とは限らないからです。
ただし、リポジトリコードをテストオブジェクトにリンクする方法、リポジトリ関数を呼び出す方法、およびリポジトリ関数が値を関連するテストオブジェクトに保存する方法に固執しています。
Acme/Quizbundle/Test/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;
}
Acme/Quizbundle/Test/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);
}