php - 日期与 Doctrine2 和 Symfony2 的交集

标签 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 中没有 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));
}

对于广告已经过期的处理,搜索总是做的,其中公告的最终日期必须大于今天的日期

->andWhere($query->expr()->gte('ad.dateFinal', 'to_date(:today)'))
->setParameter('today', new \DateTime('now'))

配置.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'])));

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

关于php - 日期与 Doctrine2 和 Symfony2 的交集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32893957/

相关文章:

sql - Sequelize.js postgres 横向使用

javascript - 将来自多个模板的 JavaScript 与 Assetic 结合起来

php - Composer 在 docker 中使用自己的 Symfony 路径(加载旧文件)

php - 没有年份的特定日期之间的 DATEDIFF 计算

php - 在 ubuntu 17.04 上安装 curl 和 mbstring php 7.1

php - 我想通过php上传图片到数据库,图片没有上传到数据库

django - 在 heroku 中设置数据库 : postgresql in django 1. 8

mysql - 是我在 3NF 中的下表。即使我有如下重复,我如何保持 3NF?

php - 如何在最后一个数组值之后加入字符串?

symfony - 如何在symfony2中一键提交多个相同类型的表单