2017-06-29 5 views
0

Ich arbeite an einem Symfony 2.8 basierten Projekt, das es einem user ermöglicht, einen order zu platzieren.Wie erhält man die Anzahl/Anzahl der Benutzer mit genau einer Bestellung in Doctrine?

Jetzt möchte ich eine Doctrine Anfrage erstellen, die die Nummer users die genau eine order zurückgibt. Ich dachte, das wäre leicht, aber ich bin auf diese stundenlang ...

  1. Wählen Sie die Benutzer und ihre Anzahl von Aufträgen
  2. alle Benutzer Wählen Sie mit order_count = 1 aus dem Ergebnis von Schritt 1
  3. einige mehr Bewerben Filter von nur Aufträge von den Benutzern im Ergebnis von Schritt 2 und durch Zugabe von Bedingung (zB Status = abgeschlossen)

in SQL folgende Arbeiten der Auswahl schöner Schritt 1 zu lösen:

SELECT user_id, COUNT(*) as count FROM order WHERE status = 'completed' GROUP BY user_id 

aber wenn ich versuche, dies zu Doctrine übersetzen ich die folgenden Fehlermeldung erhalten:

$qb->select('o_inner.user, COUNT(*) as count') 
    ->from('MyBundle:Order', 'o_inner') 
    ->where('o_inner.status = :status') 
    ->groupBy('o_inner.user') 
    ->setParameter('status', 'completed'); 

[Doctrine\ORM\Query\QueryException]        
[Syntax Error] line 0, col 30: Error: Expected Literal, got '*' 

So kann ich nicht einmal den ersten Schritt lösen. Irgendeine Idee, wie man das macht?

EDIT:

Hat einige weitere Experimente mit verschiedenen wählt:

$qb->select('o_inner.user, COUNT(o_inner.user) as count') 
$qb->select('COUNT(o_inner.user) as count') 

==> [Doctrine\ORM\Query\QueryException]                    
    [Semantical Error] line 0, col 39 near 'FROM MyBundle:Order': Error: Class 'FROM' is not defined. 


$qb->select('COUNT(o_inner.user)') 
==> Works fine. So the "as count" statement seems to be a problem 


$qb->select('o_inner.user') 
==> [Doctrine\ORM\Query\QueryException]                       
    [Semantical Error] line 0, col 12 near 'user FROM': Error: Invalid PathExpression. Must be a StateFieldPathExpression. 

$qb->select('o_inner') 
==> Workes fine 

$qb->select('o_inner, COUNT(o_inner.user)') 
==> Workes fine 

So $qb->select('o_inner, COUNT(o_inner.user)') scheint 1. für Schritt zu arbeiten, aber da ich nicht einen benutzerdefinierten Alias ​​verwenden können (... as count nicht funktioniert) , wie kann ich das Zählungsresultat in eine äußere Auswahl verweisen?

+0

Probieren Sie count (o_inner.user) oder count (o_inner.id) aus, es erwartet ein Literal. Grüße – Albeis

Antwort

1

Sie ein ORM verwenden, so müssen Sie, welches Feld Sie zählen zum Beispiel angeben: Für komplexere Abfragen wie Berichte/Statistiken

$qb->select('o_inner.user, COUNT(o_inner.user) as count') 
    ->from('MyBundle:Order', 'o_inner') 
    ->where('o_inner.status = :status') 
    ->groupBy('o_inner.user') 
    ->setParameter('status', 'completed'); 
; 
$tags = $qb->getQuery()->getResult(); 
0

Sie müssen nicht ORM verwenden.

Eine einzelne optimierte SQL-Abfrage hat möglicherweise eine bessere Leistung und ist einfacher zu verstehen und zu warten.

Verwandte Themen