Doctrine을 사용하여 여러 열로 정렬


115

두 개의 열로 데이터를 정렬해야합니다 (행에 열 번호 1에 대해 다른 값이있는 경우 순서대로, 그렇지 않으면 열 번호 2로 정렬)

내가 사용하고 QueryBuilder쿼리를 만들 수 있습니다.

orderBy메서드를 두 번 호출하면 이전에 지정된 순서를 대체합니다.

첫 번째 매개 변수로 두 개의 열을 전달할 수 있습니다.

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

그러나 두 번째 매개 변수에 대해 두 개의 순서 지정 방향을 전달할 수 없으므로이 쿼리를 실행하면 첫 번째 열은 오름차순으로 정렬되고 두 번째 열은 내림차순으로 정렬됩니다. 둘 다 내림차순을 사용하고 싶습니다.

이것을 사용하는 방법이 QueryBuilder있습니까? DQL을 사용해야합니까?

답변:


213

열 이름 바로 뒤에 주문 방향을 추가해야합니다.

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

앞서 언급했듯이 여러 호출은 orderBy 누적되지 않지만 다음을 여러 번 호출 할 수 있습니다 addOrderBy.

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

2
감사. 나는 이것을 전에 알아 차리지 못했다. 두 개의 orderBy 문이 괜찮다고 생각했습니다. 그래서 나는 addOrderBy 메소드를 깨닫지 못했습니다. 지적 해

Diego Agulló : 불행히도 귀하의 답변에있는 두 링크가 더 이상 작동하지 않습니다.
k00ni

1
@ k00ni 지적 해 주셔서 감사합니다. 전자를 최신 문서로 업데이트했지만 GitHub에서 마이그레이션 된 문제 DC-909를 찾을 수 없어 후자를 제거했습니다.
Diego Agulló

테이블 별칭이있는 쿼리 작성기의 경우 alias.column_name.
Maulik Parmar

16

Doctrine 2.x에서는 위의 예와 같이 'orderBy'또는 'addOrderBy'교리를 사용하여 여러 주문을 전달할 수 없습니다. 왜냐하면 'orderBy'함수에서와 같이 두 번째 매개 변수를 비워두면 마지막 열 이름 끝에 'ASC'가 자동으로 추가되기 때문입니다.

예를 들어 ->orderBy('a.fist_name ASC, a.last_name ASC')'ORDER BY first_name ASC, last_name ASC ASC'와 같은 SQL을 출력합니다. 그래서 이것은 SQL 구문 오류입니다. orderBy 또는 addOrderBy의 기본값이 'ASC'이기 때문입니다.

여러 주문을 추가하려면 '추가'기능을 사용해야합니다. 그리고 그것은 이렇게 될 것입니다.

->add('orderBy','first_name ASC, last_name ASC'). 이렇게하면 올바른 형식의 SQL이 제공됩니다.

add () 함수에 대한 자세한 정보. https://www.doctrine-project.org/projects/doctrine-orm/en/2.6/reference/query-builder.html#low-level-api

도움이 되었기를 바랍니다. 건배!


8

당신이 사용할 수있는 ->addOrderBy($sort, $order)

추가 : Doctrine Querybuilder btw. 종종 일반 방법의 "특별한"수정을 사용합니다 select-addSelect. where-andWhere-orWhere,, groupBy-addgroupBy...


0

orderBy소스 코드 메모에 대한 주석 : Keys are field and values are the order, being either ASC or DESC.. 그래서 당신은 할 수 있습니다 orderBy->(['field' => Criteria::ASC]).


이것은 올바르지 않습니다. 위의 내 대답 참조
Thomas Hansen

0

orderBy메서드에는 두 개의 문자열 또는 Expr\OrderBy개체 가 필요 합니다. 여러 주문 선언을 추가하려는 경우 올바른 방법은 addOrderBy메서드 를 사용 하거나 OrderBy개체를 인스턴스화 하고 그에 따라 채우는 것입니다.

   # 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)
   ;
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.