Symfony 5自定义BigDecimal Doctrine类型执行d:m:diff报错求助
问题分析与解决方案
核心问题
你遇到的错误源于自定义Doctrine类型的名称不匹配:
doctrine.yaml中注册的类型名是big_decimal- 自定义
BigDecimalType类的getName()方法返回BigDecimal - 数据库列注释里的
(DC2Type:BigDecimal)指向的是BigDecimal类型
Doctrine在数据库内省过程中,会读取列注释的类型名去匹配已注册的类型,由于注册名和注释名不对应,导致触发未知类型错误。
解决方案(二选一,保持命名完全统一即可)
方案1:统一使用小写蛇形命名big_decimal
- 修正自定义类型的
getName()方法:
public function getName(): string { return 'big_decimal'; // 改为和配置一致的名称 }
- 生成迁移更新数据库注释:
执行命令:
symfony console d:m:diff
会自动生成修正列注释的迁移代码,类似:
$this->addSql('COMMENT ON COLUMN parcel.area IS \'(DC2Type:big_decimal)\'');
执行迁移完成数据库注释同步。
3. 保持实体映射不变:
继续使用#[ORM\Column(type: 'big_decimal')],确保和配置、类型名称统一。
方案2:统一使用大驼峰命名BigDecimal
- 修正
doctrine.yaml的类型配置:
types: BigDecimal: App\Doctrine\Type\BigDecimalType
- 修正实体映射的类型名:
#[ORM\Column(type: 'BigDecimal')] // 和配置、getName()返回值一致 private BigDecimal $area;
- 清理缓存:
执行命令确保配置生效:
symfony console cache:clear
关键注意事项
- 必须保证以下四者完全一致:
doctrine.yaml中注册的类型键名- 自定义类型
getName()的返回值 - 实体
#[ORM\Column(type: ...)]的参数值 - 数据库列注释里
DC2Type:后的名称
composer update可能导致Doctrine缓存或加载逻辑变化,修改配置后务必清理缓存。
内容的提问来源于stack exchange,提问作者Filipui
相关产品推荐
相关产品推荐

