Porządkuj według wielu kolumn za pomocą Doctrine

115

Muszę uporządkować dane według dwóch kolumn (jeśli wiersze mają różne wartości w kolumnie 1, uporządkuj według niej; w przeciwnym razie uporządkuj według kolumny numer 2)

Używam QueryBuilderdo tworzenia zapytania.

Jeśli wywołam orderBymetodę po raz drugi, zastąpi ona wszystkie wcześniej określone kolejność.

Jako pierwszy parametr mogę podać dwie kolumny:

->orderBy('r.firstColumn, r.secondColumn', 'DESC');

Ale nie mogę podać dwóch kierunków uporządkowania dla drugiego parametru, więc kiedy wykonuję to zapytanie, pierwsza kolumna jest uporządkowana w kierunku rosnącym, a druga malejąca. Chciałbym użyć malejąco dla obu z nich.

Czy istnieje sposób, aby to zrobić za pomocą QueryBuilder? Czy muszę używać DQL?

zootropo
źródło

Odpowiedzi:

213

Musisz dodać kierunek zamówienia zaraz po nazwie kolumny:

$qb->orderBy('column1 ASC, column2 DESC');

Jak zauważyłeś, wiele wywołań orderBy nie kumuluje się , ale możesz wykonać wiele wywołań addOrderBy:

$qb->addOrderBy('column1', 'ASC')
   ->addOrderBy('column2', 'DESC');
Diego Agulló
źródło
2
dzięki. nie zauważyłem tego wcześniej. Myślałem, że dwa oświadczenia OrderBy są w porządku. więc nie zdawałem sobie sprawy z metody addOrderBy. okrzyki za wskazanie tego :)
Diego Agulló: Niestety oba linki w Twojej odpowiedzi już nie działają.
k00ni
1
@ k00ni dzięki za wskazanie tego. Zaktualizowałem ten pierwszy do najnowszych dokumentów, ale nie mogłem znaleźć zmigrowanego problemu DC-909 na GitHub, więc usunąłem ten drugi.
Diego Agulló
W przypadku konstruktorów zapytań z aliasami tabeli nie zapomnij dodać alias.column_name.
Maulik Parmar
16

W Doctrine 2.x nie można przekazać wielu zamówień za pomocą doktryny „orderBy” lub „addOrderBy”, jak w powyższych przykładach. Ponieważ automatycznie dodaje „ASC” na końcu nazwy ostatniej kolumny, gdy drugi parametr pozostawiono pusty, na przykład w funkcji „orderBy”.

Na przykład ->orderBy('a.fist_name ASC, a.last_name ASC')wyświetli SQL coś w rodzaju „ORDER BY first_name ASC, last_name ASC ASC”. Więc to jest błąd składni SQL. Po prostu dlatego, że domyślną wartością orderBy lub addOrderBy jest „ASC”.

Aby dodać kilka zamówień, musisz użyć funkcji „dodaj”. I tak będzie.

->add('orderBy','first_name ASC, last_name ASC'). Zapewni to poprawnie sformatowany kod SQL.

Więcej informacji na temat funkcji add (). https://www.doctrine-project.org/projects/doctrine-orm/en/2.6/reference/query-builder.html#low-level-api

Mam nadzieję że to pomoże. Twoje zdrowie!

Anjana Silva
źródło
8

możesz użyć ->addOrderBy($sort, $order)

Dodaj: Doctrine Querybuilder btw. często używa „specjalne” modyfikacje normalnych metod, zobacz select-addSelect, where-andWhere-orWhere, groupBy-addgroupBy...

Christian Huber
źródło
0

Komentarz do orderBynotatek kodu źródłowego: Keys are field and values are the order, being either ASC or DESC.. Więc możesz to zrobić orderBy->(['field' => Criteria::ASC]).

Victor S.
źródło
To nie jest poprawne. Zobacz moją odpowiedź powyżej
Thomas Hansen
0

orderByMetoda wymaga albo dwa ciągi lub Expr\OrderByobiekt. Jeśli chcesz dodać wiele deklaracji kolejności, właściwą rzeczą jest użycie addOrderBymetody lub utworzenie instancji OrderByobiektu i odpowiednie wypełnienie go:

   # Inside a Repository method:
   $myResults = $this->createQueryBuilder('a')
       ->addOrderBy('a.column1', 'ASC')
       ->addOrderBy('a.column2', 'ASC')
       ->addOrderBy('a.column3', 'DESC')
   ;

   # Or, using a OrderBy object:
   $orderBy = new OrderBy('a.column1', 'ASC');
   $orderBy->add('a.column2', 'ASC');
   $orderBy->add('a.column3', 'DESC');

   $myResults = $this->createQueryBuilder('a')
       ->orderBy($orderBy)
   ;
Thomas Hansen
źródło