QueryBuilder - IN выражение - PullRequest
       11

QueryBuilder - IN выражение

0 голосов
/ 25 января 2019

Я создал тест и записываю в БД, если люди правильно ответили на все вопросы и сколько времени они потратили на завершение теста.

Я пытаюсь создать построитель запросов, чтобы получить парня, который ответил правильно на максимум вопросов с минимумом времени.

Мой стол выглядит так: enter image description here

Итак, запрос (который работает), который я сделал в SQL в БД:

SELECT 
  id
FROM
  public.user_quizz
WHERE 
  quizz_id = 4
  AND 
    number_correct_answers IN (SELECT max(number_correct_answers) FROM user_quizz WHERE quizz_id = 4)
  AND 
    answered_in IN (SELECT min(answered_in) FROM user_quizz WHERE quizz_id = 4);

Конечно, я не знаю, является ли это лучшим (и наиболее оптимальным) запросом, который мы могли бы сделать в этом случае, но он работает.

Теперь я пытаюсь перевести этот запрос в построитель запросов.

Я заблокирован выражением IN . Я не знаю, как я мог сделать ВЫБОР здесь.

$qb = $this->createQueryBuilder('u');

        $query = $qb->select('u')
            ->andWhere(
                $qb->expr()->eq('u.quizz', ':quizzId'),
                $qb->expr()->in(
                    'u.numberCorrectAnswers',

                )
            )
            ->setParameter('quizzId', $quizz->getId())
            ->getQuery()
        ;

Спасибо за вашу помощь.

Ответы [ 2 ]

0 голосов
/ 25 января 2019

ORDER BY можно использовать для сортировки по количеству ответов и меньшему времени:

$qb = $this->createQueryBuilder('u')
   ->orderBy('u.numberCorrectAnswers', 'DESC')
   ->addOrderBy('u.answeredIn', 'ASC');
0 голосов
/ 25 января 2019
$qbSelectMax = $this->createQueryBuilder('uc')  // user copy, to prevent alias collisions
$qbSelectMax
   ->select($qb->expr()->max('uc.numberCorrectAnswers'))
   ->where($qb->expr()->eq('uc.quizz', ':quizzId'));      

$qb = $this->createQueryBuilder('u')
$query = $qb->select('u')
    ->andWhere(
        $qb->expr()->eq('u.quizz', ':quizzId'),
        $qb->expr()->in(
            'u.numberCorrectAnswers',
            $qbSelectMax->getDQL()
        )
    )
    ->setParameter('quizzId', $quizz->getId())
    ->getQuery();

Вы можете создать дополнительный DQL-запрос, чтобы сначала выбрать максимум numberCorrectAnswers, а затем передать DQL прямо в in параметр

...