2013-05-11 22 views
10

Có vấn đề lạ. Chúng ta đang sử dụng MariaDB 5.5 và doctrine/orm 2.3.3, và cố gắng sử dụng Doctrine Paginator với DQL. http://docs.doctrine-project.org/en/latest/tutorials/pagination.html

DQL có mệnh đề ORDER BY [xem ví dụ minh họa]. Tuy nhiên, kết quả không được sắp xếp ở tất cả cho một kích thước trang nhất định. Và, nếu chúng tôi tăng kích thước trang để bao gồm toàn bộ tập kết quả, việc sắp xếp sẽ chính xác.

$dql = "SELECT a, b FROM EntityA a JOIN a.propertyB b ORDER BY a.createdOn DESC"; 
    $query = $this->em->createQuery($dql) 
     ->setMaxResults($pageSize) 
     ->setFirstResult($offset); 
    $paginator = new Paginator($query, $fetchJoinCollection=true); 
    .... 

Tôi đã bỏ sql và chạy theo cách thủ công. Sql cũng đã phân loại chính xác. Vì vậy, một cái gì đó đang gây ra vấn đề sắp xếp bên trong lớp Paginator của Doctrine.

Khi tôi đặt $ fetchJoinCollection = false và chuyển nó cho trình tạo hàm Paginator, việc sắp xếp đã chính xác cho bất kỳ $ pageSize nào đã cho!

Đọc mã nguồn của Doctrine [Doctrine/ORM/Tools/Pagination/Paginator.php]. Với $ fetchJoinCollection = true, doctrine sử dụng WhereInWalker để lấy kết quả cuối cùng, không tôn trọng mệnh đề ORDER By trong DQL, vì mệnh đề IN() không tạo kết quả theo cùng thứ tự như các id bên trong Mệnh đề IN().

Giải pháp sắp xếp cho mệnh đề IN() có thể được tìm thấy trong Ordering by the order of values in a SQL IN() clause. Nhưng tôi không thể tìm thấy Doctrine bằng cách sử dụng nó.

Bất kỳ ai có kiến ​​thức nội bộ của Học thuyết sẽ làm sáng tỏ một số ?! Cảm ơn!

+0

Truy vấn của bạn có đúng không? $ dql = "SELECT a, b TỪ EntityA a JOIN a.propertyB b ORDER BỞI a.createdOn DESC"; có vẻ như bạn không chọn cột nhưng bảng? –

+0

Đây là DQL, không phải SQL. Trong ví dụ, tôi đã chọn 2 thực thể. Nhưng đó không phải là vấn đề. –

Trả lời

Các vấn đề liên quan