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

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

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

Моя таблица выглядит так: QueryBuilder — выражение IN

Итак, запрос (который работает), который я сделал в 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);

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

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

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

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

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

Почему бы вам просто не сделать собственный запрос?

emix 25.01.2019 12:49
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
1
467
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий
$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, чтобы сначала выбрать max numberCorrectAnswers, а затем передать DQL прямо в параметр in

Создать дополнительный запрос DQL работал отлично! Но я не получаю объект в конце. Когда я использую $qb->select('u'), у меня возникает ошибка ПК, как будто это бесконечный цикл, и мне приходится перезагружать ПК. Но когда я выбираю $qb->select('u.id'), это работает. Это странно

Alexis 25.01.2019 14:38

@Alexis, что ты будешь делать дальше с QB? Похоже, вы пытались сбросить результат запроса или что-то в этом роде.

Lunin Roman 25.01.2019 14:42

Да, действительно, я пытаюсь вывести запрос ($query->getDQL()) и результат ($query->getResult()). Я не должен?

Alexis 25.01.2019 14:44

ну да, var_dump($query->getResult()); приведет к тоннам данных со всеми связанными сущностями и отношениями, даже если у вас не так много данных в базе данных. Вы должны сериализовать данные и вернуть их как обычный ответ

Lunin Roman 25.01.2019 14:48

@Alexis Вот что вы, вероятно, ищете symfony.com/doc/current/components/serializer.html, так вы можете указать, какие свойства вы хотите извлечь из выбора DQL.

Lunin Roman 25.01.2019 14:50

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

$qb = $this->createQueryBuilder('u')
   ->orderBy('u.numberCorrectAnswers', 'DESC')
   ->addOrderBy('u.answeredIn', 'ASC');

Другие вопросы по теме