두 개의 열로 데이터를 정렬해야합니다 (행에 열 번호 1에 대해 다른 값이있는 경우 순서대로, 그렇지 않으면 열 번호 2로 정렬)
내가 사용하고 QueryBuilder
쿼리를 만들 수 있습니다.
orderBy
메서드를 두 번 호출하면 이전에 지정된 순서를 대체합니다.
첫 번째 매개 변수로 두 개의 열을 전달할 수 있습니다.
->orderBy('r.firstColumn, r.secondColumn', 'DESC');
그러나 두 번째 매개 변수에 대해 두 개의 순서 지정 방향을 전달할 수 없으므로이 쿼리를 실행하면 첫 번째 열은 오름차순으로 정렬되고 두 번째 열은 내림차순으로 정렬됩니다. 둘 다 내림차순을 사용하고 싶습니다.
이것을 사용하는 방법이 QueryBuilder
있습니까? DQL을 사용해야합니까?
답변
열 이름 바로 뒤에 주문 방향을 추가해야합니다.
$qb->orderBy('column1 ASC, column2 DESC');
앞서 언급했듯이 여러 호출은 orderBy
누적되지 않지만 다음을 여러 번 호출 할 수 있습니다 addOrderBy
.
$qb->addOrderBy('column1', 'ASC')
->addOrderBy('column2', 'DESC');
답변
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
도움이 되었기를 바랍니다. 건배!
답변
당신이 사용할 수있는 ->addOrderBy($sort, $order)
추가 : Doctrine Querybuilder btw. 종종 일반 방법의 “특별한”수정을 사용합니다 select-addSelect
. where-andWhere-orWhere
,, groupBy-addgroupBy
…
답변
orderBy
소스 코드 메모에 대한 주석 : Keys are field and values are the order, being either ASC or DESC.
. 그래서 당신은 할 수 있습니다 orderBy->(['field' => Criteria::ASC])
.
답변
이 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)
;