2012-09-28 14 views
5

Tôi đang cố tạo truy vấn để truy xuất các đối tượng từ một cơ sở dữ liệu Doctrine, được sắp xếp theo số lượng thành viên của mối quan hệ một-nhiều cụ thể.Làm thế nào để sắp xếp một truy vấn DTR Doctrine bằng số hoặc thành viên của một mối quan hệ?

Cụ thể hơn: Tôi có hai Thực thể: Con người và Liên kết. Một người có thể là thành viên của một liên đoàn (mối quan hệ của người có liên kết) và liên kết có thể có n người (Liên kết là mối quan hệ 'người').

Tôi muốn tạo một truy vấn DQL sẽ trả về danh sách Liên kết, được sắp xếp theo số lượng người là thành viên của Liên đoàn đó. Một cái gì đó dọc theo các dòng này:

SELECT f FROM AcmeStatsBundle:Federation f ORDER BY [number of members of f.people] 

Đó sẽ là bước đầu tiên. Có thêm một bước thứ hai, mà tôi không biết nếu có thể đạt được với một truy vấn duy nhất, mà sẽ được lọc các thành viên của mối quan hệ trước khi đếm. Giống như vậy:

SELECT f FROM AcmeStatsBundle:Federation f ORDER BY [number of (f.people p where p.attr = value)] 

Điều thứ hai sẽ là kết quả tối ưu, nhưng thứ hai thỏa mãn nhu cầu của tôi, nếu trường hợp thứ hai không khả thi trong một truy vấn.

Xin cảm ơn trước.

Trả lời

4

Có 5 chức năng tổng hợp trong DQL bạn có thể sử dụng (Doctrine 2.2): AVG, COUNT, MIN, MAXSUM.

Các truy vấn sau đây nên làm việc:

SELECT f 
FROM AcmeStatsBundle:Federation f 
LEFT JOIN f.people p 
GROUP BY f.id 
ORDER BY COUNT(p) 
WHERE p.attr = :some_value 

Để biết thêm DQL thủ đoạn gian trá Tôi đề nghị bạn nhìn lên official Doctrine docs.

+2

Cảm ơn bạn đã trả lời! Tôi đã phải thực hiện sửa đổi nhỏ cho truy vấn, vì tôi nghĩ rằng bạn không thể ORDER BY một tổng hợp mà không cần chọn nó. Vì vậy, truy vấn cuối cùng là: 'SELECT f, COUNT (p) as qtd FROM AcmeStatsBundle: Liên kết f LEFT JOIN f.people p WHERE p.attr =: some_value GROUP BY f.id ORDER BY qtr' : D –

6

Bạn có thể làm một cái gì đó dọc theo dòng:

public function getFederationsOrderedByNumberOfPeople() 
{ 
    return $this->createQueryBuilder('f') 
     ->addSelect('COUNT(p) AS HIDDEN personCount'); 
     ->leftJoin('f.people', 'p'); 
     ->groupBy('f') 
     ->orderBy('personCount', 'DESC'); 
} 

Từ khóa HIDDEN đã được bổ sung trong học thuyết 2.2, nó có nghĩa là lĩnh vực được lựa chọn sẽ không được trong kết quả, và trong trường hợp này có nghĩa là bạn chỉ cần lấy các thực thể của bạn trở lại thay vì một mảng.

Tham chiếu đến tài liệu DQL SELECT: http://doctrine-orm.readthedocs.org/en/latest/reference/dql-doctrine-query-language.html#dql-select-examples

+0

Cảm ơn bạn! Đây là cách để làm điều đó! – Russ

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