Symfony2.7+PHP5.6环境下,如何让Doctrine接受infinity为有效日期值?
解决Doctrine接受"infinity"作为日期值的问题
我来帮你搞定这个问题!你遇到的核心问题是:Doctrine默认的DateType只会严格按照Y-m-d格式解析日期,完全不识别数据库里的infinity特殊值——之前的mapping_types或types配置没起作用,是因为它们只是做类型映射,没有处理实际的转换逻辑。我们需要自定义一个Doctrine类型来专门处理这种场景。
步骤1:创建自定义Doctrine日期类型类
在你的Symfony项目里新建一个类,比如src/YourBundle/Doctrine/Type/InfinityDateType.php,代码如下:
<?php namespace YourBundle\Doctrine\Type; use Doctrine\DBAL\Types\DateType; use Doctrine\DBAL\Platforms\AbstractPlatform; class InfinityDateType extends DateType { const INFINITY_DATE = 'infinity_date'; public function convertToPHPValue($value, AbstractPlatform $platform) { // 识别数据库返回的'infinity',这里可以按业务需求返回对应值,比如null或一个极远日期 if ($value === 'infinity') { return null; // 你也可以改成 return new \DateTime('9999-12-31'); } // 非特殊值沿用父类的默认转换逻辑 return parent::convertToPHPValue($value, $platform); } public function convertToDatabaseValue($value, AbstractPlatform $platform) { // 把PHP侧的特殊值(比如null)转换为数据库的'infinity' if ($value === null) { return 'infinity'; } // 正常日期沿用父类逻辑 return parent::convertToDatabaseValue($value, $platform); } public function getName() { return self::INFINITY_DATE; } }
步骤2:在Symfony配置中注册自定义类型
修改app/config/config.yml,在doctrine.dbal节点下添加自定义类型的配置:
doctrine: dbal: # 你的原有DBAL配置(driver、host、dbname等) types: infinity_date: YourBundle\Doctrine\Type\InfinityDateType mapping_types: # 将数据库的date类型全局映射到我们的自定义类型 date: infinity_date
如果你只想让特定实体字段使用这个类型,可以跳过
mapping_types配置,直接在实体里指定类型即可。
步骤3:更新实体字段的类型
如果是局部字段使用,在实体类的字段注解里指定类型为infinity_date:
/** * @ORM\Column(type="infinity_date") */ private $expirationDate;
测试验证
现在重新运行Doctrine的schema更新命令(如果需要调整字段类型的话),然后测试写入/读取包含infinity值的日期字段,就不会再抛出Could not convert database value "infinity" to Doctrine Type date的异常了。
内容的提问来源于stack exchange,提问作者Wreigh
相关产品推荐
相关产品推荐

