如何只匹配Doctrine中最后更新的记录?

时间:2011-09-14 04:47:30

标签: php mysql doctrine-orm symfony

我正在使用Symfony2和Doctrine开发一个应用程序,并有一个名为 status 的表,我在其中存储位置和日期簿,例如:

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

最近日期的状态记录代表该图书的当前(或最后已知)位置。在上面的示例中,Book_1目前位于“朋友家”中,而Book_2位于“Home”中。

以下代码获取任何记录,这些记录在某些时候的位置为“Home”:

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

相反,我只想选择那些当前位置匹配“Home”的图书。在上面的例子中,那只是记录ID = 5(Book_2)。

有没有办法用DQL轻松完成这项工作?

非常感谢任何帮助。

谢谢,
拉尔夫

2 个答案:

答案 0 :(得分:2)

另一个问题是:“Doctrine2的DQL句柄可以选择子选择吗?”。

MySQL的查询是:

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';

答案 1 :(得分:2)

感谢您的回复。我还找到了以下资源:http://dev.mysql.com/doc/refman/5.0/en/example-maximum-column-group-row.html

我能够将其调整为以下正常工作的DQL:

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)

但是,根据上面的文章,使用带有LEFT JOIN的不相关子查询更有效。但是如果我尝试编写DQL等价物,我会收到错误。我在某处读到Doctrine不支持FROM / JOIN语句中的子查询。

任何人都可以证实吗?而且,有没有办法让上述DQL尽可能最有效?

再次感谢,
拉尔夫