5

質問とタグの2つのエンティティがあります。それらの間には多対多の関係があり、生成された'tag_question'テーブル(question_id列とtag_id列)があります。

$questions = $tag->getQuestion();

これを実行すると、すべての結果、タグ付きのすべての質問が返されます。このメソッドは、TagエンティティのDoctrine2によって自動的に生成されます。結果を制限する方法(ページ付けを追加するなど)?

4

1 に答える 1

8

パフォーマンスが大きな問題ではない場合は、Doctrineを使用してすべてのQuestionエンティティへの参照を取得し、PHPにフィルタリングを実行させる(MySQLに実行させるのではなく)ことはそれほど問題にはなりません。デフォルトでは、Doctrineは完全なエンティティを返さないことに注意してください。むしろ、プロキシオブジェクトを返します(後でデータベースへの別のクエリを介してより完全にハイドレイトすることができます)。

class Question
{
    public function getQuestions($offset = 0; $length = null)
    {
        return array_slice( $this->questions, $offset, $length );
    }
}

ただし、パフォーマンスが問題になる場合は、カスタムDQLクエリまたはDoctrineのQueryBuilderクラスを実行するメソッドを使用してカスタムリポジトリクラスを作成することを検討することをお勧めします。

class TagRepository
{
    public function findSomeByQuestion($question, $offset, $length)
    {
        $qb = $this->createQueryBuilder("tag")
            ->select("tag")
            ->join("tag.questions", "questions")
            ->where("question.id = :questionId")
            ->setParameter("questionId", $question->getId())
            ->setFirstResult($offset)
            ->setMaxResults($length);
        return $qb->getQuery()->getResult();
    }
}
于 2012-12-25T00:08:34.390 に答える