创建Doctrine查询

时间:2016-12-16 12:22:44

标签: mysql symfony doctrine-orm

我有一个测验应用程序,在UserPerformanceEntity中记录已播放的回合。相应的MySQL表如下所示:

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 个答案:

答案 0 :(得分: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'] ;

唯一的变化是,您需要来自当前用户的id而不是对象

答案 1 :(得分:1)

用户可以多次播放的其他信息,因此用户ID不是唯一的,一个用户可以拥有多条记录。这是我的解决方案:

$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'而不是设置为参数,则会出现错误。最后,我必须统计不同的用户,以获得正确的结果。