5

それぞれが質問と指定された回答 (または回答がない場合は 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);
    }
4

1 に答える 1

12

この結果を得るために使用できるさまざまなパターンがいくつかありますが、最も簡単なのは、単純に集計フィールドを使用することです。これにより、必要になるたびに情報を計算するのではなく、変更後に情報が保存されます。

別の解決策は、Test リポジトリと TestQuestion リポジトリの間に 1 対多の関連付けを作成することです (まだ存在しない場合)。その後、twig テンプレートで簡単に使用できます。Doctrine に{{ testEntity.questionsAnswered.count() }}これを"これにより、COUNT SQL ステートメントを使用して、回答済みの質問がいくつあるかを調べます (デフォルトでは、関連付けを列挙しようとすると、実際に質問エンティティをフェッチします)

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

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

于 2012-07-14T10:27:23.410 に答える