You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Symfony 5自定义BigDecimal Doctrine类型执行d:m:diff报错求助

问题分析与解决方案

核心问题

你遇到的错误源于自定义Doctrine类型的名称不匹配:

  • doctrine.yaml中注册的类型名是big_decimal
  • 自定义BigDecimalType类的getName()方法返回BigDecimal
  • 数据库列注释里的(DC2Type:BigDecimal)指向的是BigDecimal类型

Doctrine在数据库内省过程中,会读取列注释的类型名去匹配已注册的类型,由于注册名和注释名不对应,导致触发未知类型错误。


解决方案(二选一,保持命名完全统一即可)

方案1:统一使用小写蛇形命名big_decimal

  1. 修正自定义类型的getName()方法:
public function getName(): string
{
    return 'big_decimal'; // 改为和配置一致的名称
}
  1. 生成迁移更新数据库注释:
    执行命令:
symfony console d:m:diff

会自动生成修正列注释的迁移代码,类似:

$this->addSql('COMMENT ON COLUMN parcel.area IS \'(DC2Type:big_decimal)\'');

执行迁移完成数据库注释同步。
3. 保持实体映射不变:
继续使用#[ORM\Column(type: 'big_decimal')],确保和配置、类型名称统一。

方案2:统一使用大驼峰命名BigDecimal

  1. 修正doctrine.yaml的类型配置:
types:
    BigDecimal: App\Doctrine\Type\BigDecimalType
  1. 修正实体映射的类型名:
#[ORM\Column(type: 'BigDecimal')] // 和配置、getName()返回值一致
private BigDecimal $area;
  1. 清理缓存:
    执行命令确保配置生效:
symfony console cache:clear

关键注意事项

  • 必须保证以下四者完全一致:
    • doctrine.yaml中注册的类型键名
    • 自定义类型getName()的返回值
    • 实体#[ORM\Column(type: ...)]的参数值
    • 数据库列注释里DC2Type:后的名称
  • composer update可能导致Doctrine缓存或加载逻辑变化,修改配置后务必清理缓存。

内容的提问来源于stack exchange,提问作者Filipui

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 06:43:16