2016-12-16 2 views
-2

У меня есть приложение для викторины, в котором играемые раунды регистрируются в UserPerformanceEntity. Соответствующая таблица MySQL выглядит так:Создать запрос Doctrine

UserPerformance 
--------------- 
id (PK) 
user 
start_time 
end_time 
max_level 

Я хочу отобразить некоторые статистические данные, например «Вы выполнили лучше, чем x% игроков». Для того, чтобы вычислить процент игроков, которые выступали хуже, чем в настоящее время я хочу, чтобы выполнить следующий запрос: MySQL

SELECT COUNT(DISTINCT `user`) 
FROM `UserPerformance` 
WHERE 
    (end_time IS NOT NULL 
    AND end_time NOT LIKE '0000-00-00 00:00:00') 
    AND `user` != :current_user 
    AND max_level < :current_level 
ORDER BY max_level DESC 

Но я понятия не имею, как это реализовать с доктриной. Как должен выглядеть мой querybuilder?

ответ

2

попробовать это

$query = $this->createQueryBuilder('u'); 
$query->select('COUNT(DISTINCT u.id) as usercount') 
    ->where('u.end_time IS NOT NULL') 
    ->andWhere('u.end_time NOT LIKE :end_time') 
    ->andWhere('u.id != :current_userid') 
    ->andWhere('u.max_level < :current_level') 
    ->setParameter('end_time', '0000-00-00 00:00:00') 
    ->setParameter('current_userid', $current_userid) 
    ->setParameter('current_level', $current_level) 
    ->setMaxResults(1); 

$result = $query->getQuery()->getResult(); 
return $result[0]['usercount'] ; 

Единственное изменение, необходимо идентификатор из текущего пользователя вместо объекта

+0

Спасибо, ваш комментарий помог мне найти лучшее решение – ACs

1

Дополнительной информации о том, что пользователь может играть много раз, так что идентификатор пользователя не является уникальным, один пользователь может имеют много записей. Это мое решение:

$em = $this->getDoctrine()->getManager(); 
     $qb = $em->createQueryBuilder(); 
     $result = $qb->select('COUNT(DISTINCT p.user) AS usercount') 
      ->from('LoginetFBappVagoBundle:UserPerformanceEntity', 'p') 
      ->where(
       $qb->expr()->andX(
        $qb->expr()->isNotNull('p.endTime'), 
        $qb->expr()->neq('p.endTime', ':endTime'))) 
      ->andWhere($qb->expr()->neq('p.user', ':userId')) 
      ->andWhere($qb->expr()->lt('p.maxLevel', ':maxLevel')) 
      ->setParameter('endTime', '0000-00-00 00:00:00') 
      ->setParameter('userId', $userid) 
      ->setParameter('maxLevel', $level) 
      ->getQuery() 
      ->getResult(); 

Я начал с ответа @Alexander Keil, но я использовал выражение, и я понял, что нет необходимости в группу (end_time IS NOT NULL AND end_time NOT LIKE '0000-00-00 00:00:00') части. Однако, если я передаю '0000-00-00 00:00:00' в выражении вместо этого в качестве параметра, я получаю сообщение об ошибке. И, наконец, мне приходится подсчитывать отдельных пользователей, чтобы получить правильный результат.

Смежные вопросы