Пересечение дат с Doctrine2 и Symfony2

1

Это запрос, который я покажу в репозитории своего объявления:

    $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.

Но я хотел бы, чтобы вы помогли мне найти лучшее решение для чистых.

  • 0
    попробуйте использовать этот оператор lte('ad.dateFinal', 'to_date(:date)') вместо этого: lte('to_date(:date)', 'ad.dateFinal')
  • 0
    Так что это не имеет большого смысла для логики, потому что объявление FinalDate должно быть больше, чем дата начала поиска. И в настоящее время тестирование до даты окончания поиска с датой начала объявления. И когда я переворачиваю это в вопросе, он simplemesmente возвращает все объявления когда-либо. Я попробовал тот же запрос postgres, и произошло то же самое. Поэтому я думаю, что ошибка в логике, но я не могу его найти.
Теги:
doctrine2

1 ответ

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

Я исправил свою логику:

//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 различные даты.

Ещё вопросы

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