首页 > 解决方案 > 如何限制symfony QueryBuilder中左连接表中的第n条记录返回

问题描述

我一直遇到返回左连接投票表限制每个 Answer 50 行记录的问题。答案表与投票表具有一对多的关系。我如何限制每个答案的前 50 行投票?查询生成器是否允许限制左连接表?

$query = $this->getDoctrine()->createQueryBuilder();
$results = $query
         ->select('a')
         ->addSelect('v')
         ->from('answers', 'a')
         ->leftJoin('votes', 'v')
         ->orderBy('v.postedTime', 'ASC')
         ->getQuery()
         ->getArrayResult();

如果 QueryBuilder 无法实现如何创建原始查询?

$query = $this->getDoctrine()->createQuery(
            "SELECT a.*, v.*
                FROM answer a
                LEFT JOIN a.votes v
                ORDER BY v.postedTime ASC
        )

标签: mysqlsqldoctrine-orm

解决方案


嗨!试试看,由于我不知道完整的上下文,因此存在不准确之处。如果您发现基本错误,请写

$numberVotes = 50;
$firstNumberVotesQuery = $this->getDoctrine()->createQueryBuilder()
    ->select('vote.id as vote_id')
    ->from(Vote::class, 'Vote')
    ->where('Vote.answer = Answer')
    ->orderBy('Vote.id', 'ASC')
    ->setMaxResults($numberVotes)
;


$query = $this->getDoctrine()->createQueryBuilder()
    ->select('Answer', 'Vote')
    ->from(Answer::class, 'Answer')
    ->leftjoin('Answer.votes', 'Vote', 'WITH', $qb->expr()->in('Vote.id', '(' . $firstNumberVotesQuery->getDql()  . ')'))
    ->getQuery()
    ->getResult()
;

在 SQL 中,我认为应该是这样的

SELECT *
FROM answer
LEFT JOIN vote ON answer.id = vote.answer_id AND vote.id IN (
    SELECT id
    FROM vote first_50_votes
    WHERE first_50_votes.answer_id = answer.id
    ORDER BY id
    LIMIT 50
)

推荐阅读