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