日期与 Doctrine2 和 Symfony2 的交集

Intersection of dates with Doctrine2 and Symfony2

这是我在广告存储库中使用的查询:

    $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'));
    }

我的目的是使参数传递的日期(即开始日期和结束日期)与我的广告期间(即日期和最终日期)相交。

有什么更好的方法?

因为我在考虑 apena 使用 to_date 使 paremetro 的最后日期被理解为最新。当然,由于他在 Doctrine2 中没有 to_date,我将不得不制作一个自定义 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));
}

处理ad已经过期,搜索总是做的,这里公告的最后日期必须大于今天的日期

->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' 日期时间函数的 / 有问题所以有那部分代码:

$date = date('d-m-Y', strtotime(str_replace('/', '-', $paramFetcher['date'])));

这通常很令人困惑,因为几个国家/地区使用不同的日期。