Как ограничить возврат n-й записи в левой соединительной таблице в symfony QueryBuilder

#mysql #sql #doctrine-orm

Вопрос:

Я столкнулся с проблемой возврата записей ограничения таблицы голосования по левому объединению, состоящей из 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
        )
 

Ответ №1:

Хай! Попробуйте, есть неточности из-за того, что я не знаю полного контекста. Если вы видите фундаментальные ошибки, пожалуйста, напишите

 $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
)