2016-12-16 1 views
-2

Ich habe eine Quiz-Anwendung, wo gespielte Runden in UserPerformanceEntity eingeloggt sind. Die entsprechende MySQL-Tabelle wie folgt aussieht:Create Doctrine Abfrage

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

Ich möchte einige Statistiken anzuzeigen, wie "Sie besser als x% der Spieler. Um den Prozentsatz der Spieler zu berechnen, die schlechter ab als die aktuell Ich mag folgende MySQL-Abfrage auszuführen:

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 

Aber ich habe keine Ahnung, wie dies zu implementieren mit Lehre. Wie sollte mein QueryBuilder aussehen?

Antwort

2

versuchen diese

$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'] ; 

Die einzige Änderung ist, müssen Sie ID aus aktuellen Benutzer statt Objekt

+0

Vielen Dank, Ihr Kommentar hat mir geholfen, die beste Lösung zu finden – ACs

1

Zusätzliche Informationen, die ein Benutzer oft spielen können, so Benutzer-ID nicht eindeutig ist, ein Benutzer kann habe viele Aufzeichnungen. Dies ist meine Lösung:

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

ich von @Alexander Keil Antwort gestartet, aber ich benutzte Ausdrücke, und ich herausgefunden, dass es keine Notwendigkeit, zu einer Gruppe der (end_time IS NOT NULL AND end_time NOT LIKE '0000-00-00 00:00:00') Teil. Wenn ich jedoch '0000-00-00 00:00:00' im Ausdruck übergebe und stattdessen als Parameter setze, erhalte ich einen Fehler. Und schließlich muss ich die einzelnen Benutzer zählen, um das richtige Ergebnis zu erhalten.

Verwandte Themen