gpt4 book ai didi

php - Symfony + Doctrine Oracle DateTime 格式问题

转载 作者:可可西里 更新时间:2023-10-31 23:50:48 24 4
gpt4 key购买 nike

我在 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com