Intereting Posts
PHP Неустранимая ошибка: не удается получить доступ к пустому свойству PHP-скрипт для резервного копирования базы данных MySQL PHP Count Количество истинных значений в булевом массиве Как заставить PDO запускать SET NAMES utf8 каждый раз, когда я подключаюсь, в ZendFramework Что означает и делает MYSQLI_NUM? ZF2 Как илиWhere () Массовая вставка в Laravel с использованием красноречивой ORM Какова цель контроллера в шаблоне MVC с использованием PHP? Внутренний массив forach Может ли PHP сказать, если сервер 64-битный? Laravel запрещает пользователям редактировать / просматривать ресурсы других пользователей WordPress – / wp-admin / перенаправление на /wp-login.php при входе в систему Лучший способ реализовать шаблон декоратора для кэширования результатов метода в PHP PHP Получить протокол URL сайта – http vs https Глубокие (бесконечные) разделенные слова с использованием регулярного выражения

Как сопоставить только последние обновленные записи в Doctrine?

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

Любая помощь приветствуется.

Благодаря,
Ральф

Solutions Collecting From Web of "Как сопоставить только последние обновленные записи в Doctrine?"

Другой вопрос: «Может ли обработать 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 максимально эффективным?

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