Doctrine中@JoinColumn设置name后自动加_id后缀问题及缓存排查
Doctrine关联映射:解决自动添加_id后缀导致的列不存在问题
你遇到的这个情况我太熟悉了,一开始很容易误以为是命名策略或者注解配置的问题,结果最后发现是缓存在搞鬼!先一步步梳理下:
问题复盘
你在Symfony4项目里仅用Doctrine作为ORM(不使用Migrations),给现有表的owner列映射ManyToOne关联,代码如下:
/** * @var InternalUser * @ORM\ManyToOne(targetEntity="App\Entity\InternalUser", inversedBy="blocos") * @ORM\JoinColumn(nullable=false, name="owner") */ private $owner;
但查询时Doctrine自动给列名加上了_id后缀,生成的SQL里出现了t0.owner_id,而数据库实际只有owner列,直接触发Undefined column错误。你试过在@JoinColumn里同时设置name="owner"和referencedColumnName="owner"也没用,排查默认的UnderscoreNamingStrategy后发现和这个后缀无关,又不能修改数据库列名,属实头疼。
最终解决方案:清理缓存!
经提醒后确认,这根本不是配置问题,就是缓存失效导致的!Doctrine会缓存实体的映射元数据,如果你之前的映射配置有过变动(比如一开始没指定name属性),后来修改后没清理缓存,它就会一直沿用旧的映射逻辑自动添加_id后缀。
只需要执行Symfony的缓存清理命令即可:
# 开发环境清理缓存 php bin/console cache:clear # 生产环境清理缓存 php bin/console cache:clear --env=prod
清理完成后再测试,Doctrine就会正确使用你指定的owner列名,不会自动添加后缀了。
题外话:缓存的“经典坑”
不得不说,菲尔·卡尔顿的这句话简直戳中了无数开发者的痛点:
计算机科学领域有两大难题:缓存失效与命名。
很多看似复杂的ORM映射异常,本质都是缓存没更新导致的,下次碰到类似问题,先清缓存准没错!
内容的提问来源于stack exchange,提问作者scripts
相关产品推荐
相关产品推荐

