QueryBuilder - IN 表达式
QueryBuilder - IN expression
我创建了一个测验,如果人们对所有问题的回答都正确,我会在数据库中记录他们完成测验所花费的时间。
我正在尝试创建一个查询生成器,以检索在最短时间内正确回答最多问题的人。
我的 table 看起来像这样:
所以,我在数据库 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 表达式上被屏蔽了。我不知道如何在此处执行 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();
您可以先创建 select max numberCorrectAnswers
的子 DQL 查询,然后将 DQL 直接传递到 in
参数
ORDER BY
可用于按答案数量和所用时间进行排序:
$qb = $this->createQueryBuilder('u')
->orderBy('u.numberCorrectAnswers', 'DESC')
->addOrderBy('u.answeredIn', 'ASC');
我创建了一个测验,如果人们对所有问题的回答都正确,我会在数据库中记录他们完成测验所花费的时间。
我正在尝试创建一个查询生成器,以检索在最短时间内正确回答最多问题的人。
我的 table 看起来像这样:
所以,我在数据库 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 表达式上被屏蔽了。我不知道如何在此处执行 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();
您可以先创建 select max numberCorrectAnswers
的子 DQL 查询,然后将 DQL 直接传递到 in
参数
ORDER BY
可用于按答案数量和所用时间进行排序:
$qb = $this->createQueryBuilder('u')
->orderBy('u.numberCorrectAnswers', 'DESC')
->addOrderBy('u.answeredIn', 'ASC');