2011-09-01 11 views
8

Ho la seguente query:Come posso limitare un risultato di entità associata in Doctrine2?

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

$result = $query->getResult(); 

voglio limitare la motivazione oggetti restituiti per ogni utente di essere il risultato di questa seconda query che sto usando altrove (Sul repository motivazione):

$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'è un modo per limitare e limitare la motivazione nella prima query o un approccio migliore?

+1

Considerando scritto qui sotto, e supponendo che "l'ultima motiviation" è di primaria importanza per voi e sarà accesso molto, la soluzione possibile è creare la relazione "Utente: UltimaMotivazione' OneToOne. E poi ogni volta che viene aggiunta una nuova entità "Motivazione" (tramite eventi Doctrine 'prePersist') aggiorna' LatestMotivation' con quella appena aggiunta. In questo modo sarai in grado di scorrere su molti record di 'User' riprendendo le ultime motivazioni. HTH –

risposta

14

Non è possibile limitare il numero di righe congiunte.

Se si dispone di Dottrina 2.1 è possibile utilizzare ->slice() sulla raccolta:

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

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

+0

Grazie - L'ho arrotondato aggiungendo un altro metodo alla mia Entità Utente che aggiunge solo una singola voce di motivazione, che scorre sopra l'oggetto e sovrascrive la proprietà $ motivazione. Sporco ma funziona. – codecowboy

+2

@ amaud576875 Unfotunately il metodo slice inizializza le associazioni solo per l'utente corrente. Se si esegue il loop su più utenti, vengono generate più query. C'è un modo per recuperare la collezione affettata per tutti gli utenti? –

+1

@PetrPeller Ho un problema simile. Sei riuscito a risolverlo? – svlada

Problemi correlati