2016-12-21 3 views
0

Ich habe ein großes Problem mit ORM QueryBuilder. Was ich tun muss, ist: Ich muss order mit der Zählung seiner products und viele zugehörige Entitäten (mit order assoziiert) holen, aber ich nehme an, dass sie hier nicht relevant sind. Ich muss das Ergebnis auch nach dieser Anzahl sortieren.Doctrine2 QueryBuilder select Entity und Anzahl der verknüpften Entitäten

Kann mir jemand ein Beispiel geben, wie dies erreicht werden kann? Ich möchte wenn möglich "Inline" DQLs vermeiden.

+0

Ich denke über 2 Lösungen nach. Erstens, um die Anzahl der Produkte in der Reihenfolge zu halten, dann vermeiden Sie komplizierte und langsame Abfragen. Zweitens ist die Verwendung von DQL mit [DTO] (http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/dql-doctrine-query-language.html#new-operator-syntax) Objekt –

+0

Oder Sie zählen in PHP, wenn Sie bereits die Produkte auch holen. –

+0

@ skowron-line das ist nicht machbar, denn im nächsten Schritt muss ich die "Anzahl" nach Status des Produkts filtern und so wird es wirklich häufig aktualisiert werden. Ich möchte unnötige Updates vermeiden, um Feld in Reihenfolge zu zählen. Auch es geht gegen die Normalisierung. – user1970395

Antwort

2

Sie können Daten über Doctrine Query Builder abrufen.

Sie sollen Produkte von Order links verbinden und dann nach Bestell-ID gruppieren. Sie können COUNT(product.id) in Ihrer Select-Anweisung verwenden und den Alias ​​in der order by-Klausel verwenden, um Ihre Bestellungen zu sortieren. Unten ist ein kleines Code-Snippet von Repository.

/** 
* @return \Doctrine\ORM\Query 
*/ 
public function getHotelAndRoomType() 
{ 
    $qb = $this->createQueryBuilder('order') 
     ->select('partial order.{id, orderId} as order, count(product.id) as total_products_in_order') 
     ->leftJoin('AppBundle:Product', 'product', 'WITH', 'product.order = order.id') 
     ->groupBy('order.id') 
     ->orderBy('total_products_in_order', 'DESC') 
    ; 

    return $qb->getQuery()->execute(); 
} 

Hinweis: Code nicht getestet.

+0

Funktioniert wie erwartet, das ist die richtige Lösung, nach der ich gesucht habe. – user1970395

Verwandte Themen