2011-09-01 5 views
8

Mam następujące zapytanie:Jak mogę ograniczyć powiązaną encję wynik w Doctrine2?

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

$result = $query->getResult(); 

chcę ograniczać motywację obiektów zwracanych przez każdego użytkownika za wynik tego drugiego zapytania, które używam w innym miejscu (w repozytorium motywacyjny):

$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(); 

Czy istnieje sposób na ograniczenie i ograniczenie motywacji w pierwszym zapytaniu lub lepszym podejściu?

+1

Zważywszy napisane poniżej i przy założeniu, że „ostatni motiviation” ma zasadnicze znaczenie dla ciebie i to będzie często dostępne, możliwe rozwiązanie to utworzenie relacji o nazwie "User: LatestMotivation" OneToOne. A następnie za każdym razem, gdy dodawana jest nowa jednostka "Motywacja", (poprzez zdarzenia Doctrine 'prePersist') aktualizuj' LatestMotivation' z nowo dodanym. W ten sposób będziesz mógł przeglądać wiele rekordów 'User', pobierając najnowsze motywacje. HTH –

Odpowiedz

14

Nie można ograniczyć liczby wspólnych wierszy.

Jeśli masz Doctrine 2.1 można użyć ->slice() w kolekcji:

$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) 

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

+0

Dzięki - obejrzałem go, dodając inną metodę do mojego Podmiotu Użytkownika, który dodaje pojedynczy wpis motywacyjny, zapętla się nad obiektem i nadpisuje właściwość motywacji $. Brudne, ale działa. – codecowboy

+2

@ amaud576875 Niestety, metoda slice inicjuje powiązania tylko dla bieżącego użytkownika. Jeśli tworzysz pętlę nad wieloma użytkownikami, tworzonych jest wiele zapytań. Czy istnieje sposób, aby pobrać plasterki kolekcji dla wszystkich użytkowników? –

+1

@PetrPeller Mam podobny problem. Czy udało ci się go rozwiązać? – svlada

Powiązane problemy