2011-09-14 11 views
6

Estoy desarrollando una aplicación con Symfony2 y Doctrina, y una tabla llamada estado donde almaceno la ubicación y la fecha de libros, tales como:¿Cómo hacer coincidir solo los últimos registros actualizados en Doctrine?

ID | Book  | Date  | Location 
------------------------------------------------ 
1 | Book_1  | 2011-08-29 | Home 
2 | Book_1  | 2011-08-30 | Office 
3 | Book_1  | 2011-09-02 | Friend's House 
4 | Book_2  | 2011-09-02 | Office 
5 | Book_2  | 2011-09-04 | Home 

El registro de estado con la fecha más reciente representa la actual (o última conocida) ubicación de ese libro. En el ejemplo anterior, Book_1 se encuentra actualmente en "Friend's House" y Book_2 está en "Home".

El código siguiente obtiene cualquier registros que en algún momento tuvieron un lugar de "Inicio":

$em = $this->getEntityManager(); 
$query = $em->createQuery('SELECT s FROM myBookTestBundle:Status s WHERE s.location=:x')->setParameter('x', 'Home'); 
$status = $query->getResult(); 

En su lugar, me gustaría seleccionar sólo aquellos libros cuyos actual ubicación partidos "Inicio" . En el ejemplo anterior, eso solo sería registrar ID = 5 (Libro_2).

¿Hay alguna manera de hacer esto fácilmente con DQL?

Cualquier ayuda es muy apreciada.

Gracias,
Ralph

Respuesta

2

La otra pregunta es: "¿Puede DQL de Doctrine2 manejar subselects?".

La consulta de MySQL sería:

select ID,Book,`Date`,Location 
    from Status a 
    where `Date` = 
    (select max(`Date`) from Status group by Book having Book = a.Book) 
    and Location = 'Home'; 
2

Gracias por su respuesta. También encontré el siguiente recurso: http://dev.mysql.com/doc/refman/5.0/en/example-maximum-column-group-row.html

Y yo era capaz de adaptar esto en la siguiente DQL que funciona correctamente:

SELECT s1 FROM myBookTestBundle:Status s1 WHERE s1.Location=:location 
AND s1.Date=(SELECT MAX(s2.Date) FROM myBookTestBundle:Status s2 WHERE s1.Book=s2.Book) 

Sin embargo, de acuerdo con el artículo anterior, es más eficaz utilizar una incorrelados sub-consulta con un LEFT JOIN. Pero si trato de escribir el equivalente DQL, obtengo un error. Leí en alguna parte que Doctrine no admite subconsultas en las declaraciones FROM/JOIN.

¿Alguien puede confirmar esto? Y, ¿hay alguna forma de hacer que el DQL anterior sea lo más eficiente posible?

Gracias de nuevo,
Ralph

Cuestiones relacionadas