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 QueryBuilder
do tworzenia zapytania.
Jeśli wywołam orderBy
metodę 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?
źródło
alias.column_name
.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!
źródło
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
...źródło
Komentarz do
orderBy
notatek 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])
.źródło
orderBy
Metoda wymaga albo dwa ciągi lubExpr\OrderBy
obiekt. Jeśli chcesz dodać wiele deklaracji kolejności, właściwą rzeczą jest użycieaddOrderBy
metody lub utworzenie instancjiOrderBy
obiektu i odpowiednie wypełnienie go:źródło