2010-06-23 7 views
5

Wie finden Sie ein gruppenweises Maximum oder die Zeile, die den maximalen Wert enthält, in Doctrine? In SQL würde ich dies normalerweise mit einem Self-Join tun, wie beschrieben here.Gruppieren von Maximum in Doku finden

Während es in Doctrine möglich ist, eine Selbstbeziehung einzurichten, gibt es dafür bessere Möglichkeiten?

+0

Gründe, warum Sie keine Selbstbeziehung verwenden möchten? – DrColossos

+0

Zwei Gründe: 1) Es scheint das ORM-Modell zu verletzen. Das heißt, es ist nicht sinnvoll, dass das Objekt eine Kopie von sich selbst hat. 2) Ich mache diese Abfrage selten, so dass es sich nicht lohnt, eine Beziehung hinzuzufügen. –

Antwort

5

Beispiel groupwise max:

$query = Doctrine_Query::create() 
    ->select("txs.id, txs.amount, txs.valid_from") 
    ->from("Tx txs") 
    ->where("txs.amount = (SELECT MAX(transact.amount) FROM tx transact WHERE txs.id = transact.id)"); 

Beispiel für Zeile mit maximal:

$query = Doctrine_Query::create() 
->select("txs.id, txs.amount, txs.valid_from") 
->from("Tx txs") 
->where("txs.id = (SELECT transact.id FROM tx transact WHERE transact.amount = (SELECT MAX(transactx.amount) FROM tx transactx))"); 

Diese sind wahrscheinlich nicht die einzigen Möglichkeiten (oder die meisten sauber), aber ich beide nur getestet und sie funktionieren .

1

Diese Frage ist wirklich alt, aber es rangiert hoch auf Google für "Doktrin groupwise max", also dachte ich, dass ich meine Lösung hinzufügen würde.

In meinem Fall hatte ich eine Eltern Entity mit vielen Kindern und ich wollte Felder aus dem Kind mit der höchsten ID auswählen.

$qb 
    ->select('child1.field') 
    ->from(Entity::class, 'entity') 
    ->join('entity.children', 'child1') 
    ->leftJoin('entity.children', 'child2', 'WITH', 'child1.entity=child2.entity AND child1.id<child2.id') 
    ->where('child2.id IS NULL') 
;