2013-03-22 13 views
10

Próbuję zrobić proste zapytanie w doktrynie, ale walczę.Doctrine orderBy na polu SUMA() z aliasem

$query->select(array(
    'app_title' => 'u.title', 
    'user_name' => 'u.user_name', 
    'first_used' => 'MIN(u.creation_time)', 
    'last_used' => 'MAX(u.stop_time)', 
    'total_usage' => 'SUM(u.stream_seconds)', 
)) 
->from(self::USAGE_TABLE, 'u') 
->orderBy('total_usage', 'DESC'); 

Oczywiście pojawia się błąd o nazwie kolumny nie jest znany, ponieważ doktryna jest go używać własnych aliasów (sclr4).

Jednakże, jeśli spróbuję i uporządkuję według rzeczywistej wartości; SUMA (u.stream_seconds), a następnie otrzymuję niespodziewany nawias w kolejności klauzuli, jestem prawie pewien, że SQL nie obsługuje tego.

Po prostu próbuję umieścić dane w tabeli i zajmuję się sortowaniem kolumn. Wydaje się to takie proste, jak to zrobić? Jakieś pomysły?

Odpowiedz

22
  1. Można orderby pole wynik SUM przez umieszczamy ją w projekcji zapytań przez aliasing wynik używając AS.
  2. Jeśli chcesz użyć funkcji agregującej, takiej jak MIN(), MAX(), AVG(), musisz użyć GROUP BY.

Spróbuj simmilar do tego, który działa idealnie dla mnie (BTW zamiast tablicy asocjacyjnej w select metody):

$q = $this->em()->createQueryBuilder(); 

$q->select(['product.id', 'product.title']) 
    ->addSelect('SUM(product.price) AS HIDDEN stat_sum_realised') 
    ->from('ModuleAdmin\Entity\ProductEntity', 'product') 
    ->groupBy('product.id'); 

$q->orderBy('stat_sum_realised', 'DESC'); 

funkcje agregujące są tutaj szczegółowo (ex dla MySQL): http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html

Od wersji Doctrine ORM 2.3 można również użyć słowa kluczowego HIDDEN, które pozwoli uniknąć (w tym przypadku) stat_sum_realised przed nawadnianiem się w zestawie wyników.

+1

To pomaga, teraz mam problem tylko wtedy, gdy zaczynam używać setFirstResult do stronicowania .. "Wystąpił wyjątek podczas wykonywania polecenia" SELECT * FROM (SELECT ROW_NUMBER() OVER (ORDER BY sclr4 DESC) AS doktryna_rownum .. "oczywiście daje" Nieprawidłowa nazwa kolumny "sclr4". "ale nie mogę wydawać się pracować nad tym, jak to zatrzymać! – YorkshireDeveloper

+1

@YorkshireDeveloper Czy kiedykolwiek zastanawiałeś się, dlaczego dostałeś" Nieprawidłową nazwę kolumny "sclr4" "wyjątek? Mam ten sam problem. – NSAddict