2010-06-23 4 views
5

Jak znaleźć maksymalne wartości grupowe lub wiersz zawierający wartość maksymalną w Doctrine? W SQL zazwyczaj robiłbym to za pomocą samo łączeń, jak opisano w here.Ustalanie maksymalnej liczby grupowej w Doctrine

Chociaż w Doktrynie można ustawić relacje własne, czy istnieją lepsze sposoby na zrobienie tego?

+0

Jakieś powody, dla których nie chcesz używać relacji z samym sobą? – DrColossos

+0

Dwa powody: 1) Wygląda na to, że narusza model ORM. Oznacza to, że nie ma sensu, aby obiekt miał swoją kopię. 2) Robię to rzadko, więc nie wydaje mi się, że warto dodać relację. –

Odpowiedz

5

Przykład 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)"); 

Przykład rzędu zawierającego maksymalnie:

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

Nie są one prawdopodobnie jedynymi sposobami (lub najbardziej czyste), ale tylko sprawdzony zarówno i pracują .

1

To pytanie jest naprawdę stare, ale bardzo wysoko ocenia Google za "doktrynę groupwise max", więc pomyślałem, że dodam moje rozwiązanie.

W moim przypadku miałem podmiot nadrzędny z wieloma dziećmi i chciałem wybrać pola od dziecka z najwyższym identyfikatorem.

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