Sắp xếp theo nhiều cột với Doctrine


115

Tôi cần sắp xếp dữ liệu theo hai cột (khi các hàng có giá trị khác nhau cho cột số 1, hãy sắp xếp theo thứ tự đó; nếu không, hãy sắp xếp theo cột số 2)

Tôi đang sử dụng một QueryBuilderđể tạo truy vấn.

Nếu tôi gọi orderByphương thức này lần thứ hai, nó sẽ thay thế bất kỳ chuỗi giá trị nào được chỉ định trước đó.

Tôi có thể chuyển hai cột làm tham số đầu tiên:

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

Nhưng tôi không thể chuyển hai hướng sắp xếp cho tham số thứ hai, vì vậy khi tôi thực hiện truy vấn này, cột đầu tiên được sắp xếp theo hướng tăng dần và cột thứ hai, giảm dần. Tôi muốn sử dụng giảm dần cho cả hai.

Có cách nào để làm điều này bằng cách sử dụng QueryBuilderkhông? Tôi có cần sử dụng DQL không?

Câu trả lời:


213

Bạn phải thêm hướng thứ tự ngay sau tên cột:

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

Như bạn đã lưu ý, nhiều cuộc gọi orderBy không xếp chồng lên nhau , nhưng bạn có thể thực hiện nhiều cuộc gọi đến addOrderBy:

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

2
cảm ơn. tôi đã không nhận thấy điều này trước đây. Tôi nghĩ rằng hai câu lệnh orderBy là ok cho việc này. vì vậy tôi không nhận ra phương thức addOrderBy. cổ vũ cho trỏ nó ra :)

Diego Agulló: Rất tiếc, cả hai liên kết trong câu trả lời của bạn đều không hoạt động nữa.
k00ni

1
@ k00ni cảm ơn vì đã chỉ ra điều này. Tôi đã cập nhật tài liệu cũ lên tài liệu mới nhất, nhưng tôi không thể tìm thấy vấn đề đã di chuyển DC-909 trên GitHub, vì vậy tôi đã xóa tài liệu sau.
Diego Agulló

Đối với các trình tạo truy vấn có bí danh bảng, đừng quên thêm alias.column_name.
Maulik Parmar

16

Trong Doctrine 2.x, bạn không thể chuyển nhiều thứ tự bằng cách sử dụng học thuyết 'orderBy' hoặc 'addOrderBy' như các ví dụ trên. Bởi vì, nó tự động thêm 'ASC' vào cuối tên cột cuối cùng khi bạn để trống tham số thứ hai, chẳng hạn như trong hàm 'orderBy'.

Đối với một ví dụ ->orderBy('a.fist_name ASC, a.last_name ASC')sẽ xuất ra SQL một cái gì đó như sau 'ORDER BY first_name ASC, last_name ASC ASC'. Vì vậy, đây là lỗi cú pháp SQL. Đơn giản vì mặc định của orderBy hoặc addOrderBy là 'ASC'.

Để thêm nhiều thứ tự của bạn cần sử dụng chức năng 'thêm'. Và nó sẽ như thế này.

->add('orderBy','first_name ASC, last_name ASC'). Điều này sẽ cung cấp cho bạn SQL được định dạng chính xác.

Thông tin thêm về hàm add (). https://www.doctrine-project.org/projects/doctrine-orm/en/2.6/reference/query-builder.html#low-level-api

Hi vọng điêu nay co ich. Chúc mừng!


8

bạn có thể dùng ->addOrderBy($sort, $order)

Thêm: Doctrine Querybuilder btw. thường sử dụng "đặc biệt" thay đổi của các phương pháp thông thường, xem select-addSelect, where-andWhere-orWhere, groupBy-addgroupBy...


0

Các bình luận cho orderByghi chú mã nguồn: Keys are field and values are the order, being either ASC or DESC.. Vì vậy, bạn có thể làm orderBy->(['field' => Criteria::ASC]).


Điều này LAF không đúng. Xem câu trả lời của tôi ở trên
Thomas Hansen

0

Các orderByphương pháp yêu cầu hoặc hai chuỗi hoặc một Expr\OrderByđối tượng. Nếu bạn muốn thêm nhiều khai báo đơn hàng, điều chính xác là sử dụng addOrderByphương thức hoặc khởi tạo một OrderByđối tượng và điền đối tượng đó cho phù hợp:

   # 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)
   ;
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.