日期与Doctrine2和Symfony2的交集

时间:2015-10-01 17:59:08

标签: php postgresql symfony doctrine-orm

这是我在广告资源库中的查询:

    $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中进行过任务,所以我必须自定义DQL。

但我希望你能帮助我找到更清洁的解决方案。

1 个答案:

答案 0 :(得分: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'])));

这通常非常令人困惑,因为有几个国家使用不同日期的padões。