【问题标题】:How to use DATE_ADD in Doctrine's Querybuilder? [duplicate]如何在 Doctrine 的 Querybuilder 中使用 DATE_ADD? [复制]
【发布时间】:2021-06-08 11:11:59
【问题描述】:

我正在做一个回购,以查找在一段时间内完成的所有预订。 我有一个入住日期和他们入住的天数。

/*
* @return array
*/
public function findAllByHotelIdAndDate(int $id, \DateTime $date)
{

    $qb = $this->createQueryBuilder('re')
        ->leftJoin(Room::class, 'ro')
        ->leftJoin(Hotel::class, 'h')
        ->where('h.id =:idHotel')
        ->andWhere('re.checkIn >= :date')
        ->andWhere("DATE_ADD(re.checkIn, re.nights, 'day') <= :date")
        ->setParameters(['date' => $date, 'idHotel' => $id])
        ;

    $query = $qb->getQuery();
    return $query->execute();
}

我的问题在于DATE_ADD 的使用。 我的语法正确吗?

【问题讨论】:

  • 我无法编辑我的问题,但我收到一条错误消息:SQLSTATE[42000]: 语法错误或访问冲突:1064 Erreur de syntaxe près de 'WHERE h4_.id = 1 AND r0_.check_in >= '2021-06-03 00:00:00' AND '2021-06-03 00:00' à la ligne 1 当我执行此查询时
  • 嗨,谢谢@yivi。这是我一开始遇到的两个问题,但我仍然有这个问题。我试图将我的变量放在 DATE_ADD 之前,但没有任何改进。我的查询没有看到问题。我试过单引号,双引号
  • 编辑链接位于问题底部的标签下方。没有什么特别的原因让您无法对其进行编辑。

标签: php doctrine-orm doctrine dql


【解决方案1】:

要使用 DATE_ADD,您必须在您的原则配置中添加原则扩展(您似乎已经完成了,但在这里提醒一下):

doctrine:
    dbal:
        url: '%env(resolve:DATABASE_URL)%'
        server_version: '5.6'
        # IMPORTANT: You MUST configure your server version,
        # either here or in the DATABASE_URL env var (see .env file)
        #server_version: '13'
    orm:
        auto_generate_proxy_classes: true
        naming_strategy: doctrine.orm.naming_strategy.underscore_number_aware
        auto_mapping: true
        mappings:
            App:
                is_bundle: false
                type: annotation
                dir: '%kernel.project_dir%/src/Entity'
                prefix: 'App\Entity'
                alias: App

        string_functions:
            DATE: DoctrineExtensions\Query\Mysql\Date
            DATE_FORMAT: DoctrineExtensions\Query\Mysql\DateFormat

您需要安装Doctrine extension(请参阅https://github.com/doctrine-extensions/DoctrineExtensions) 您也可以添加自己的 dql 函数(参见文档:https://symfony.com/doc/current/doctrine/custom_dql_functions.html

那么使用它的格式就是你做的那个:

                    ->where("DATE_ADD(u.date,u.old,'day') <  :now")

其中 u.date 是用户创建日期,例如,u.old 是用户年龄

->where("DATE_ADD(DATTIME,INTEGER,'day') <  PARAMETER")

【讨论】:

  • 谢谢,我把它放在我的学说.yaml 中,但我在“doctrine”下收到一条错误消息“无法识别的选项“dql”。你的意思是“dbal”吗?如果用 dbal 更改它,我获取 dbal 的“重复密钥”提及在第 19 行检测到“重复密钥“dbal”(靠近“DATE_FORMAT:”,如果我把它放在 server_version 下面,它也不起作用。我把我的 yaml 放在代码共享上:codeshare.io/9OyYM1 .
  • 我用您的 yaml 编辑了我的答案,如果您想了解更多信息,还添加了一些文档
猜你喜欢
  • 2014-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-25
  • 2016-11-21
  • 1970-01-01
相关资源
最近更新 更多