Я разрабатываю приложение с Symfony2 и 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
Запись состояния с самой последней датой представляет текущее (или последнее известное) местоположение этой книги. В приведенном выше примере Book_1 в настоящее время находится в «Доме друзей», а Book_2 находится в «Доме».
Следующий код получает любые записи, которые в какой-то момент имели место «Главная»:
$em = $this->getEntityManager(); $query = $em->createQuery('SELECT s FROM myBookTestBundle:Status s WHERE s.location=:x')->setParameter('x', 'Home'); $status = $query->getResult();
Вместо этого я хотел бы выбрать только те книги, текущее местоположение которых совпадает с «Главная». В приведенном выше примере это будет только идентификатор записи = 5 (Book_2).
Есть ли способ сделать это легко с DQL?
Любая помощь приветствуется.
Благодаря,
Ральф
Другой вопрос: «Может ли обработать DQL-дескриптор Doctrine2?».
Запрос для 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';
Спасибо за ваш ответ. Я также нашел следующий ресурс: 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 максимально эффективным?
Еще раз спасибо,
Ральф