3

この質問は、私が尋ねた (そして有効な回答を受け取った)ここのフォローアップです。

これを DQL に変換するにはどうすればよいですか? JOIN に関するドキュメントは、私には少しわかりにくいです。


編集:

私は Symfony2 で Doctrine を使用しており、次のエンティティがあります。

質問:

/**
 * @ORM\Entity
 * @ORM\Table(name="Question", indexes={@ORM\Index(name="id_idx", columns={"id"})})
 */

class Question
{
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    /**
     * @var string question
     *
     * @ORM\Column(name="question", type="string", length=255)
     */
    private $question;

    /**
     * @var array scores
     *
     * @ORM\OneToMany(targetEntity="Score", mappedBy="question")
     */
    private $scores;

    // getters and setters
}

スコア:

/**
 * @ORM\Entity
 * @ORM\Table(name="Score", indexes={@ORM\Index(name="id_idx", columns={"id"})})
 */

class Score
{
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    /**
     * @var integer $question
     *
     * @ORM\ManyToOne(targetEntity="Question", inversedBy="scores")
     * @ORM\JoinColumn(name="question_id", referencedColumnName="id")
     */
    private $question;

    /**
     * @var float score
     *
     * @ORM\Column(name="score", type="float")
     */
    private $score;

    // getters and setters
}

次のクエリを使用しました。

$query = $em->createQuery('SELECT q AS question, AVG(s.score) AS average FROM CMSBundle:Question q JOIN q.scores s GROUP BY q.id ORDER BY q.id ASC');

$questions = $query->getResult();

ただし、そのクエリでは、$questions に含まれる要素は 0 です。エラーも発生していません (少なくとも、PhpStorm がデバッガーで見つけることができるエラーはありません)。

クエリから文字通り何も得られない理由についてのフィードバックが不足しているため、少し途方に暮れています。どんな助けでも大歓迎です。

4

1 に答える 1

1

ちょうど先週、まさにこの問題に出くわしたことを覚えています。これを行う方法を理解するのに長い時間を費やし、次の DQL を思いつくことができました。質問のリポジトリ クラスに新しいメソッドを追加します。

質問に合わせて自分のコードを微調整する必要があったため、動作する保証はありませんが、試してみてください。

<?php

namespace Acme\CMSBundle\Entity;

use Doctrine\ORM\EntityRepository;

class QuestionRepository extends EntityRepository
{
    /**
     * @return array
     */
    public function findAverageScoresPerQuestion()
    {
        $dql = <<<SQL
SELECT
    q question,
    AVG(s.score) average
FROM
    Acme\CMSBundle\Entity\Question q,
    Acme\CMSBundle\Entity\Score s
WHERE
    s.question = q.id
GROUP BY q.id
ORDER BY q.id ASC
SQL;

        $q = $this->_em->createQuery($dql);

        return $q->getResult();
    }
}

コントローラーから Twig を使用して結果をレンダリングする場合、questionプロパティは 1 レベル深くネストされます。

public function averageScoresAction()
{
    $em = $this->getDoctrine()->getManager();
    $questions = $em->getRepository('AcmeCMSBundle:Question')->findAverageScoresPerQuestion();

    return $this->render('AcmeCMSBundle:Question:questions.html.twig', array(
        'questions' => $questions
    ));
}

questions.html.twig

  <table>
    <thead>
      <tr>
        <th>Question
        <th>Average Score
      </tr>
    </thead>
    <tbody>
    {% for q in questions %}
      <tr>
        <td>{{ q.question.question }}
        <td>{{ q.average }}
      </tr>
    {% else %}
      <tr>
        <td colspan="2">No results found
      </tr>
    {% endfor %}
    </tbody>
  </table>
于 2013-06-08T15:18:25.897 に答える