2011-09-01 22 views
8

Tengo la siguiente consulta:¿Cómo puedo limitar el resultado de una entidad asociada en Doctrine2?

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

$result = $query->getResult(); 

quiero para restringir la motivación objetos devueltos por cada usuario para que sea el resultado de esta segunda consulta que estoy usando en otro lugar (en el repositorio de motivación):

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

¿Hay alguna forma de limitar y restringir la motivación en la primera consulta o un mejor enfoque?

+1

Teniendo en cuenta lo escrito abajo, y suponiendo que "la última motiviation" es de primordial importancia para usted y será se accede mucho, la posible solución es crear 'Usuario: LatestMotivation' OneToOne relatinship. Y luego cada vez que se agrega una nueva entidad 'Motivación', (a través de los eventos' prePersist' de Doctrine) actualiza 'LatestMotivation' con la recién agregada. De esta forma podrá iterar sobre muchos registros de 'Usuario' obteniendo la última motivación. HTH –

Respuesta

14

No puede limitar el número de filas conjuntas.

Si tiene Doctrina 2.1 se puede utilizar ->slice() en la colección:

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

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

+0

Gracias. Lo redondeé agregando otro método a mi Entidad usuaria que simplemente agrega una sola entrada de motivación, recorriendo el objeto y sobrescribiendo la propiedad $ motivation. Sucio pero funciona. – codecowboy

+2

@ amaud576875 Desgraciadamente, el método de división inicializa las asociaciones solo para el usuario actual. Si recorre múltiples usuarios, se producen múltiples consultas. ¿Hay alguna manera de recuperar colecciones en rodajas para todos los usuarios? –

+1

@PetrPeller Tengo un problema similar. ¿Has logrado resolverlo? – svlada

Cuestiones relacionadas