Как сопоставить только последние обновленные записи в Doctrine? - PullRequest
6 голосов
/ 14 сентября 2011

Я разрабатываю приложение с 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":

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

Вместо этого я хотел бы выбрать только те книги, чье местоположение current соответствует "Home". В приведенном выше примере это будет только ID записи = 5 (Book_2).

Есть ли способ сделать это легко с помощью DQL?

Любая помощь очень ценится.

Спасибо,
Ральф

Ответы [ 2 ]

2 голосов
/ 15 сентября 2011

Спасибо за ваш ответ.Я также нашел следующий ресурс: 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 максимально эффективным?

Еще раз спасибо,Ральф

2 голосов
/ 14 сентября 2011

Другой вопрос: «Может ли Dct 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';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...