Это запрос, который я покажу в репозитории своего объявления:
$query->andWhere($query->expr()->lte(':date', 'ad.date'));
if (array_key_exists('date', $paramFetcher)) {
$query->setParameter('date', new \DateTime($paramFetcher['date']));
} else {
$query->setParameter('date', new \DateTime('now'));
}
if (array_key_exists('dateFinal', $paramFetcher)) {
$query
->andWhere($query->expr()->lte('ad.dateFinal', ':dateFinal'))
->setParameter('dateFinal', new \DateTime($paramFetcher['dateFinal']));
} else {// Ad of treatment that has expired
$query
->andWhere($query->expr()->gte('ad.dateFinal', ':dateFinal'))
->setParameter('dateFinal', new \DateTime('now'));
}
Мое намерение состоит в том, чтобы сделать пересечение между датой, переданной параметром (которая является датой начала и окончанием), и периодом моего объявления (которое является датой и датой Final).
какой лучший способ сделать?
Потому что я думал об использовании apena to_date, чтобы сделать последнюю дату для paremetro понятой на сегодняшний день. Конечно, поскольку у него нет to_date в Doctrine2, я должен был бы создать собственный DQL.
Но я хотел бы, чтобы вы помогли мне найти лучшее решение для чистых.
Я исправил свою логику:
//the start date of the search must be less than the end date of Ad
if (array_key_exists('date', $paramFetcher)) {
$date = date('d-m-Y', strtotime(str_replace('/', '-', $paramFetcher['date'])));
$query
->andWhere($query->expr()->gte('ad.dateFinal', 'to_date(:date)'))
->setParameter('date', new \DateTime($date));
}
//the search deadline must always be greater than the date of the Ad
if (array_key_exists('dateFinal', $paramFetcher)) {
$dateFinal = date('d-m-Y', strtotime(str_replace('/', '-', $paramFetcher['dateFinal'])));
$query
->andWhere($query->expr()->lte('ad.date', 'to_date(:dateFinal)'))
->setParameter('dateFinal', new \DateTime($dateFinal));
}
для обработки объявления истек, поиск всегда выполняется, когда окончательная дата объявления должна быть больше, чем сегодня.
->andWhere($query->expr()->gte('ad.dateFinal', 'to_date(:today)'))
->setParameter('today', new \DateTime('now'))
config.yml
orm:
...
dql:
...
datetime_functions:
to_date: Delivve\WebBundle\DQL\ToDate
ToDate.php
class ToDate extends FunctionNode
{
public $date;
/**
* @override
*/
public function getSql(SqlWalker $sqlWalker)
{
return "to_date(" . $this->date->dispatch($sqlWalker) . ", 'YYYY-MM-DD')";
}
/**
* @override
*/
public function parse(Parser $parser)
{
$parser->match(Lexer::T_IDENTIFIER);
$parser->match(Lexer::T_OPEN_PARENTHESIS);
$this->date = $parser->ArithmeticPrimary();
$parser->match(Lexer::T_CLOSE_PARENTHESIS);
}
}
Дата проходила через параметр, поступающий в формате "dd/mm/yyyy", когда функция Datetime имеет проблему с /, поэтому есть часть кода:
$date = date('d-m-Y', strtotime(str_replace('/', '-', $paramFetcher['date'])));
Это часто очень сбивает с толку, потому что несколько стран используют padoys различные даты.
lte('ad.dateFinal', 'to_date(:date)')
вместо этого:lte('to_date(:date)', 'ad.dateFinal')