Как получить Доктрину, чтобы не создать всегда верный сценарий?

0

Я пытаюсь сравнить значения datetime с помощью Doctrine.

У меня есть запрос Doctrine, который выглядит так:

$interval = new \DateInterval('PT'. 2 .'H');
$oldestAllowedDateTime = new \DateTime();
$oldestAllowedDateTime = $oldestAllowedDateTime->sub( $interval );

$queryBuilder = $repository->createQueryBuilder('pn');
$queryBuilder = $queryBuilder->select('notification')
  ->from('AppBundle\Entity\PushNotification','notification')
  ->where('pn.isSent IS NULL OR pn.isSent = 0')
  ->andwhere('pn.sendDate > :oldestAllowedDateTime')
  ->orderBy('pn.sendDate', 'DESC')
;
$queryBuilder->setParameter('oldestAllowedDateTime',$oldestAllowedDateTime);
$result = $queryBuilder->getQuery()->getResult();

... и он создает SQL, который выглядит так:

SELECT p0_.id AS id_0, 
p0_.content AS content_1, p0_.last_offset AS last_offset_2, 
p0_.failure_count AS failure_count_3, p0_.is_sent AS is_sent_4, 
p0_.send_date AS send_date_5 FROM push_notification p1_, 
push_notification p0_ WHERE (p1_.is_sent IS NULL OR p1_.is_sent = 0) 
AND p1_.send_date > ? ORDER BY p1_.send_date DESC

Doctrine возвращает все записи, в том числе те, которые старше, чем указанное мне время. Это имеет смысл в некотором роде, поскольку Doctrine, похоже, настраивает сценарий "всегда истинный", в котором используется сравнение временной метки, которое я хочу сделать.

Есть ли простой способ заставить Doctrine вернуть записи, которые новее, чем мое старое значениеAllowedDateTime?

====

Изменение: Вот содержимое send_date из моей базы данных.

mysql> SELECT send_date FROM push_notification;
+---------------------+
| send_date           |
+---------------------+
| 2018-01-24 05:51:21 |
| 2018-01-24 11:44:30 |
+---------------------+
2 rows in set (0.00 sec)
  • 0
    Почему вы используете псевдоним? Я не вижу здесь никакой необходимости, может быть, вы сократили свой запрос ^^ Пожалуйста, дайте нам определение доктрины PushNotification.sendDate (сущность), пожалуйста.
  • 1
    Благодарю. Теперь я предоставил два значения, которые вы запрашивали. Что касается использования псевдонима: я считаю, что createQueryBuilder выдает ошибку, если псевдоним не предоставляется.
Показать ещё 2 комментария
Теги:
doctrine
doctrine2

1 ответ

1
Лучший ответ

Ваш код выглядит хорошо, попробуйте следующую функцию

// Inside your PushNotificationrRepository
public function getNotSentByDateInterval(\DateTimeInterval $interval)
{
    $from = (new \DateTime())->sub($interval);

    $qb = $this->createQueryBuilder('pn');
    $qb->where('pn.isSent IS NULL OR pn.isSent = 0')
      ->andWhere('pn.sendDate > :oldestAllowedDateTime')
      ->setParameter('oldestAllowedDateTime', $from)
      ->orderBy('pn.sendDate', 'DESC')
    ;

    return $qb->getQuery()->getResult();
}

Это должно сделать работу

  • 0
    Это сделал это. Все, что мне нужно было сделать, это также прокормить хранилище, и я получил именно тот результат, на который надеялся. Благодарю.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню