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