2011-09-01 30 views
8

Tôi có truy vấn sau đây:Làm cách nào để giới hạn kết quả thực thể được liên kết trong Doctrine2?

$query = $this->getEntityManager()->createQuery(' 
         SELECT u, p, m 
         FROM MyCoreBundle:User u 
         JOIN u.programmes p 
         JOIN u.motivation m 
         '); 

$result = $query->getResult(); 

Tôi muốn hạn chế động lực đối tượng được trả về cho mỗi người dùng là kết quả của truy vấn này thứ hai mà tôi đang sử dụng ở nơi khác (Trên kho Động lực):

$query = $this->getEntityManager()->createQuery(' 
         SELECT m FROM MyCoreBundle:Motivation m 
         WHERE m.user = :user 
         ORDER BY m.date DESC'); 

$query->setParameter('user',$user); 
$query->setFirstResult(0); 
$query->setMaxResults(1); 
//@TODO if there is not result recorded for the user, return sth which indicates this 
return $query->getResult(); 

Có cách nào để giới hạn và hạn chế động lực trong truy vấn đầu tiên hoặc cách tiếp cận tốt hơn không?

+1

Xét viết dưới đây, và giả định rằng "motiviation mới nhất" là quan trọng hàng đầu cho bạn và nó sẽ được truy cập rất nhiều, giải pháp có thể là để tạo ra 'User: LatestMotivation' OneToOne relatinship. Và sau đó mỗi khi một thực thể 'Motivation' mới được thêm vào, (thông qua các sự kiện trước của Doctrine' prePersist') cập nhật 'LatestMotivation' với một mới được thêm vào. Bằng cách này, bạn sẽ có thể lặp qua nhiều bản ghi 'Người dùng' tìm nạp động lực mới nhất. HTH –

Trả lời

14

Bạn không thể giới hạn số lượng hàng liên kết.

Nếu bạn có học thuyết 2.1 bạn có thể sử dụng ->slice() vào bộ sưu tập:

$collection = $user->getMotivations(); // returns a LazyCollection, 
              // makes no SQL query 

$motivations = $collection->slice(0, 20); // queries the first 20 motivations 
              // for this user (if the association 
              // was not fetch-joint) 

Xem http://www.doctrine-project.org/docs/orm/2.0/en/tutorials/extra-lazy-associations.html

+0

Cảm ơn - Tôi đã làm tròn nó bằng cách thêm một phương thức khác vào thực thể người dùng của tôi mà chỉ thêm một mục nhập động cơ duy nhất, lặp lại đối tượng và ghi đè thuộc tính $ motivation. Bẩn nhưng nó hoạt động. – codecowboy

+2

@ amaud576875 Unfot luck phương thức slice khởi tạo các kết hợp chỉ dành cho người dùng hiện tại. Nếu bạn lặp lại nhiều người dùng, nhiều truy vấn được tạo. Có cách nào để lấy bộ sưu tập cắt lát cho tất cả người dùng không? –

+1

@PetrPeller Tôi có vấn đề tương tự. Bạn đã quản lý để giải quyết nó? – svlada

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