php - Symfony + Doctrine Oracle DateTime 格式问题

标签 php oracle symfony doctrine

我在 Symfony 2.7 + Doctrine 中遇到 Oracle DateTime 类型的问题。 我有一个带有 DateTime 列的表,它通过 Doctrine 在 Symfony 中映射。

当我尝试保留相关实体时,出现以下错误:

Could not convert database value "31-MAY-16 03.56.49.000000 PM" to Doctrine Type datetime. Expected format: Y-m-d H:i:s File: .../vendor/doctrine/dbal/lib/Doctrine/DBAL/Types/ConversionException.php Line: 63

我无法更改 Oracle 数据库中的默认格式。 我之前通过修改 vendor/doctrine/dbal/lib/Doctrine/DBAL/Platforms/OraclePlatform.php 中的方法 getDateTimeFormatString() 解决了这个问题并且它有效。

但是,由于我必须使用 Git 和“composer install ...”才能在生产环境中部署我的应用程序,所以所有供应商都是从 Symfony 存储库安装的;这样我就丢失了我在 OraclePlatform.php

中所做的更改

为了在不接触 verdors 库的情况下解决问题,我尝试在 httpd init 启动脚本上设置以下 Oracle ENV 变量,但它不起作用

export NLS_TIME_FORMAT="HH24:MI:SS"
export NLS_DATE_FORMAT="YYYY-MM-DD HH24:MI:SS"
export NLS_TIMESTAMP_FORMAT="YYYY-MM-DD HH24:MI:SS"
export NLS_TIMESTAMP_TZ_FORMAT="YYYY-MM-DD HH24:MI:SS TZH:TZM"

我在 Known Vendor Issues 中找到了可能的解决方案在关于 PostgreSQL 的 Doctrine 文档中,他们建议通过覆盖这样的类型来使用 VarDateTimeType:

use Doctrine\DBAL\Types\Type;

Type::overrideType('datetime', 'Doctrine\DBAL\Types\VarDateTimeType');
Type::overrideType('datetimetz', 'Doctrine\DBAL\Types\VarDateTimeType');
Type::overrideType('time', 'Doctrine\DBAL\Types\VarDateTimeType');

这似乎是解决方案,但我不知道如何使用上面的代码覆盖类型,但主要是将上面的代码放在哪里。

有人知道吗? 谢谢

附言我正在使用没有时区的 DateTime

最佳答案

创建一个扩展 DateTimeType 的自定义 DBAL 类型并覆盖 convertToPHPValue 函数(我复制了 VarDateTimeType 类,它无法成功转换我的 Oracle 安装使用的日期类型):

<?php

namespace YourCompany\SomeBundle\Doctrine\DBAL\Types;

use Doctrine\DBAL\Platforms\AbstractPlatform;
use Doctrine\DBAL\Types\ConversionException;
use Doctrine\DBAL\Types\DateTimeType;

class SillyDateTimeType extends DateTimeType
{
    /**
     * {@inheritdoc}
     * @throws \Doctrine\DBAL\Types\ConversionException
     */
    public function convertToPHPValue($value, AbstractPlatform $platform)
    {
        if ($value === null || $value instanceof \DateTime) {
            return $value;
        }

        $val = \DateTime::createFromFormat('d-M-y H.i.s.u A', $value);
        if ( ! $val instanceof \DateTime) {
            throw ConversionException::conversionFailed($value, $this->getName());
        }

        return $val;
    }
}

$val =\DateTime::createFromFormat('d-M-y H.i.s.u A', $value); 替换为您的安装为这些列返回的任何格式。

然后在config.yml中的dbal下注册即可:

# app/config/config.yml
doctrine:
    dbal:
        types:
          sillydatetime: YourCompany\SomeBundle\Doctrine\DBAL\Types\SillyDateTimeType

现在您可以在列类型规范中的任何位置使用 sillydatetime(或任何您称之为的名称)。

关于php - Symfony + Doctrine Oracle DateTime 格式问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37723240/

相关文章:

sql - Group By 子句中的别名 - 标识符无效

symfony - 如何使用 Symfony 运行 ember-cli?

php - Symfony "No route found for "GET/check.php“全新安装

javascript - 如何使用 JavaScript 将 php 表单输入更改为数字?

php - 有没有办法按时间表恢复 MySQL 数据库

java - 如何确定 JAVA 中 jdbcTemplate 的 sql 查询类型?

sql - 查找按订单聚合的最大日期 - Oracle SQL

symfony 服务 : override just one parameter

php - 使用 PHP EHLO 进行 SMTP 验证

php - 单元测试 : Simulate a timeout with Guzzle 5