Я хочу выполнить следующий запрос:
$qb = $this->getEntityManager()->createQueryBuilder(); $qb->select( 'e' ) ->from( 'Entity\Event', 'e' ) ->setMaxResults( $limit ) ->setFirstResult( $offset ) ->orderBy('e.dateStart', 'ASC'); $events = $qb->getQuery()->getResult();
где
/** * User * * @ORM\Table(name="event") * @ORM\Entity(repositoryClass="Repositories\EventRepository") */ class Event { /** * @var \DateTime * * @ORM\Column(name="date_start", type="datetime", precision=0, scale=0, nullable=true, unique=false) */ private $dateStart; ... }
Но порядок не работает. Мои результаты не отображаются по дате начала.
Я ищу, чтобы получить 20 первых событий, происходящих с самого быстрого и последнего
Как я могу это сделать ?
благодаря
РЕДАКТИРОВАТЬ:
Следуя предыдущему ответу, я обновляю свой запрос. к сожалению, я все еще не могу работать. Пожалуйста помоги
$qb->select( 'e' ) ->from( 'Entity\Event', 'e' ) ->Where( $qb->expr()->andX( $qb->expr()->between('e.dateStart', ':from', ':to') ) ) ->orderBy('e.dateStart', 'ASC') ->setFirstResult( $offset ) ->setMaxResults( $limit );
и$qb->select( 'e' ) ->from( 'Entity\Event', 'e' ) ->Where( $qb->expr()->andX( $qb->expr()->between('e.dateStart', ':from', ':to') ) ) ->orderBy('e.dateStart', 'ASC') ->setFirstResult( $offset ) ->setMaxResults( $limit );
благодаря
РЕДАКТИРОВАТЬ 2: Кажется, он движется по порядку. У меня сейчас нет ошибок. Сценарий работает нормально с orderBy, НО НЕ ЗАКАЗЫВАЕТСЯ по дате времени!
В моих результатах я не вижу ничего, что заставило бы меня подумать, что оно было заказано на основе какого-либо свойства, окончательно не в день!
Как это возможно?
Поле Datetime выглядит примерно так в DB: 2014-05-24 19:30:00
Когда я var Dump запрашивает запросы, которые возникают из предыдущего запроса, вот что у меня для поля datetie:
["dateStart"]=> string(8) "DateTime"
Означает ли это, что это действительно строка для доктрины, и поэтому она не сортируется по дате?
благодаря
Вы должны проверить структуру таблицы в базе данных :
Какой тип столбца date_start
?
Это должно быть DATETIME
(в MySQL другие поставщики могут отличаться).
Но я подозреваю, что это какая-то форма строки, например VARCHAR
(или CHAR
, TEXT
и т. Д.).
Когда это так, результат упорядочен , но не так, как вы ожидаете. Это связано с тем, что различные типы упорядочиваются по-разному с помощью базы данных.
Doctrine поставляется с консольным инструментом, который способен проверять ваши сопоставления и проверять, совместима ли с ними база данных: doctrine orm:validate-schema
.
Если он сообщает о несоответствиях с базой данных, используйте doctrine orm:schema-tool:update --dump-sql
чтобы отобразить запросы, которые он будет выполнять для обновления базы данных (предполагается, что сопоставления являются источником правды).
ваш запрос будет выглядеть так:
$qb->select( 'e' ) ->from( 'Entity\Event', 'e' ) ->orderBy('e.dateStart', 'ASC'); ->setFirstResult( $offset ) ->setMaxResults(20);
вы должны уважать порядок параметров построителя запросов, я надеюсь, что это поможет.
Не могли бы вы дать мне результат:
$qb->select( 'e' ) ->from( 'Entity\Event', 'e' ) ->setMaxResults( $limit ) ->setFirstResult( $offset ) ->orderBy('e.dateStart', 'ASC'); die($qb->getQuery()->getSql());
Один из возможных вариантов: хорошо ли объявлен ваш геттер для свойства $ dateStart? Должен быть:
public function getDateStart() { return $this->dateStart; }
Возможно, вы можете переписать свой код следующим образом
$qb = $this->getEntityManager()->createQueryBuilder(); $qb->select( 'e' ) ->from( 'Entity\Event', 'e' ) ->setMaxResults( $limit ) ->setFirstResult( $offset ) ->orderBy('date(e.dateStart) ASC');//this is the trick that works for me $events = $qb->getQuery()->getResult();