2012-07-20 19 views
81

tôi cần phải đặt dữ liệu bằng hai cột (khi các hàng có giá trị khác nhau cho cột số 1, trật tự của nó, nếu không, trật tự theo cột số 2)Sắp xếp theo nhiều cột với Học thuyết

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

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

tôi có thể vượt qua hai cột như tham số đầu tiên:

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

Nhưng tôi không thể vượt qua hai hướng trật tự 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 một hướng tăng dần và 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 để thực hiện việc này bằng cách sử dụng QueryBuilder không? Tôi có cần sử dụng DQL không?

Trả lời

161

Bạn phải bổ sung theo hướng trật tự ngay sau tên cột:

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

Như các bạn đã lưu ý, nhiều cuộc gọi đến orderBydo not stack, nhưng bạn có thể làm cho nhiều cuộc gọi đến addOrderBy:

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

cảm ơn. tôi đã không nhận thấy điều này trước đây. tôi nghĩ 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 chỉ nó ra :) – Sharpy35

5

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

Thêm: Trình quản lý truy vấn btw. thường sử dụng các sửa đổi "đặc biệt" của các phương pháp thông thường, xem select-addSelect, where-andWhere-orWhere, groupBy-addgroupBy ...

11

Trong Doctrine 2.x bạn không thể chuyển nhiều thứ tự bằng cách sử dụng giáo lý 'orderBy' hoặc 'addOrderBy' như ví dụ trên. Bởi vì, nó tự động thêm 'ASC' ở 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'.

Ví dụ ->orderBy('a.fist_name ASC, a.last_name ASC') sẽ xuất SQL 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 orderBy hoặc addOrderBy là 'ASC'.

Để thêm nhiều đơn đặt hàng, 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 đúng.

Thông tin thêm về hàm add(). http://www.doctrine-project.org/api/orm/2.2/class-Doctrine.ORM.QueryBuilder.html#_add

Hy vọng điều này sẽ hữu ích. Chúc mừng!