Как сравнить поле datetime с Doctrine2 с датой?
Я хочу получить элементы, которые были созданы сегодня с помощью QueryBuilder из Doctrine2. Я хочу сравнить поле createdAt (Datetime) с сегодняшним параметром (Date). Возможно ли это сделать в одном запросе?
$qb = $this->createQueryBuilder('i');
$qb->innerJoin('i.type', 'it');
$qb->andWhere('it.name = :type');
$qb->andWhere('i.createdAt < :today');
// i.createdAt == datetime and :today parameter is a date
Ответы
Ответ 1
одна идея состоит в том, чтобы извлечь из даты: год, месяц и день. И затем
$qb->select('p')
->where('YEAR(p.postDate) = :year')
->andWhere('MONTH(p.postDate) = :month')
->andWhere('DAY(p.postDate) = :day');
$qb->setParameter('year', $year)
->setParameter('month', $month)
->setParameter('day', $day);
MONTH DAY, и YEAR вы вынимаете DoctrineExtensions из
например.
DoctrineExtensions
Это работает для меня. Вам нужны только файлы: day.php, month.php и year.php.....
Вы получаете месяц, например:
$datetime = new \DateTime("now");
$month = $datetime->format('m');
echo $month;
Скопируйте day.php, month.php и year.php в свой комплект Xy\TestBundle\Dql
Зарегистрируйте новые функции в app\config.yml с помощью
doctrine:
orm:
auto_generate_proxy_classes: %kernel.debug%
entity_managers:
default:
auto_mapping: true
dql:
datetime_functions:
month: Xy\TestBundle\Dql\Month
year: Xy\TestBundle\Dql\Year
day: Xy\TestBundle\Dql\Day
Ответ 2
Редко, что такой зрелый ORM не предоставляет функцию DATE
. Однако, чтобы получить дату из поля datetime, вы можете применить функцию SUBSTRING
следующим образом:
SELECT SUBSTRING(i.dateTimeField,1,10) FROM tableName i
Надеюсь, что это поможет!
Ответ 3
Существует лучший вариант, чем добавление расширения доктрины для даты.
Сначала вам нужно получить start-datetime и end-datetime:
$today_startdatetime = \DateTime::createFromFormat( "Y-m-d H:i:s", date("Y-m-d 00:00:00") );
$today_enddatetime = \DateTime::createFromFormat( "Y-m-d H:i:s", date("Y-m-d 23:59:59") );
Теперь используйте их в запросе:
$em = \Zend_Registry::get('em');
$qb_1 = $em->createQueryBuilder();
$q_1 = $qb_1->select('wsh')
->from('\Entities\wishes', 'wsh')
->where('wsh.created_at >= :today_startdatetime')
->andWhere('wsh.created_at <= :today_enddatetime');
$q_1->setParameter('today_startdatetime', $today_startdatetime);
$q_1->setParameter('today_enddatetime', $today_enddatetime);
$result= $q_1->getQuery ()->getResult ();
Ответ 4
Также возможно использовать встроенную функцию DATE_DIFF(date1, date2)
, которая возвращает разницу в днях. Проверьте docs
$result = $this->createQueryBuilder('l')
->where('DATE_DIFF(l.startDate, CURRENT_DATE()) = 0')
Ответ 5
Вы должны добавить к вашему запросу QueryBuilder параметр today
.
$today = new \DateTime();
$qb->setParameter('today', $today->format('Y-m-d'));
В QueryBuilder вы можете сравнить даты с DateTime с форматом 'Y-m-d'
Ответ 6
Простым решением будет форматирование даты и времени соответственно
public function getWithStartingPremium(\DateTime $datetime)
{
$qb = $this->createQueryBuilder('c');
return $qb
->innerJoin('c.collegePremium', 'cp')
->where($qb->expr()->eq('cp.start', ':date'))
->setParameters(array(
'date' => $datetime->format('Y-m-d'),
))
->getQuery()
->getResult();
}