Symfony Doctrine添加联合唯一约束时出现编译错误
解决Doctrine创建联合唯一约束时的编译错误
问题场景
在PostgreSQL环境下,用Doctrine实体注解给两个字段加联合唯一约束,执行make:migration时抛出错误:
Compile Error: Constant expression contains invalid operations
原实体注解代码如下:
#[ ORM\Entity(repositoryClass: SalesChannelRepository::class), ORM\Table( name: "sales_channel", schema: "my_schema", UniqueConstraint: [ UniqueConstraint( name: "name_idx", fields: ["sales_channel_name_id", "multi_channel_id"] ), ] ), ]
错误原因及修复方案
注解参数名写错
Doctrine的ORM\Table注解中,指定唯一约束的参数是复数形式的uniqueConstraints,你写的单数UniqueConstraint是无效参数名,这会导致注解解析异常。缺少命名空间前缀
数组内的UniqueConstraint类必须加上ORM\命名空间前缀,否则PHP找不到该类,直接写UniqueConstraint会触发类不存在的隐性错误,进而引发编译异常。PHP版本限制
如果你的PHP版本低于8.1,在注解的数组参数里直接实例化对象(new XXX(...))会触发这个编译错误——PHP 8.0及更早版本不允许在常量表达式(包括注解参数)中使用new操作符,必须升级到PHP 8.1及以上版本才能这么写。
修正后的代码
#[ ORM\Entity(repositoryClass: SalesChannelRepository::class), ORM\Table( name: "sales_channel", schema: "my_schema", uniqueConstraints: [ new ORM\UniqueConstraint( name: "name_idx", fields: ["sales_channel_name_id", "multi_channel_id"] ), ] ), ]
替代方案(无法升级PHP时)
如果暂时没法升级PHP版本,可以放弃注解方式,改用Doctrine支持的XML或YAML映射文件来定义唯一约束,避开在注解中使用new表达式的限制。
内容的提问来源于stack exchange,提问作者BernardA
相关产品推荐
相关产品推荐

