Я создал викторину и записываю в БД, правильно ли люди ответили на все вопросы, и сколько времени они потратили на прохождение викторины.
Я пытаюсь создать построитель запросов, чтобы найти парня, который правильно ответил на максимальное количество вопросов с минимальным временем.
Итак, запрос (который работает), который я сделал в 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()
;
Спасибо за вашу помощь.


$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, что ты будешь делать дальше с QB? Похоже, вы пытались сбросить результат запроса или что-то в этом роде.
Да, действительно, я пытаюсь вывести запрос ($query->getDQL()) и результат ($query->getResult()). Я не должен?
ну да, var_dump($query->getResult()); приведет к тоннам данных со всеми связанными сущностями и отношениями, даже если у вас не так много данных в базе данных. Вы должны сериализовать данные и вернуть их как обычный ответ
@Alexis Вот что вы, вероятно, ищете symfony.com/doc/current/components/serializer.html, так вы можете указать, какие свойства вы хотите извлечь из выбора DQL.
ORDER BY можно использовать для сортировки по количеству ответов и меньшему времени:
$qb = $this->createQueryBuilder('u')
->orderBy('u.numberCorrectAnswers', 'DESC')
->addOrderBy('u.answeredIn', 'ASC');
Почему бы вам просто не сделать собственный запрос?