如何在PHP Attributes中为ORM\Table配置ORM\Index实例数组
正确实现方式
你需要在indexes数组中直接实例化ORM\Index对象,同时不要遗漏实体类必要的#[ORM\Entity]注解:
use Doctrine\ORM\Mapping as ORM; // 必须添加Entity注解,否则Doctrine不会识别为有效实体 #[ORM\Entity] #[ORM\Table( indexes: [ new ORM\Index(name: 'first_index', columns: ['username', 'password', 'email']), new ORM\Index(name: 'second_index', columns: ['email']), new ORM\Index(name: 'third_index', columns: ['email', 'username','language']) ] )] class SomeClass { // 类的属性和方法实现 }
错误原因说明
- 第一种关联数组写法:
ORM\Table的indexes参数要求接收ORM\Index实例数组,传入二维关联数组不符合类型要求,因此IDE会报类型错误,Doctrine也无法正常解析映射规则。 - 第二种数组内嵌套
#[ORM\Index]写法:#[...]是PHP注解的标记语法,仅可用于类、方法、属性、参数等结构的声明前,不能作为数组内的值使用,因此会导致注解解析失效。
注意事项
- 需保证PHP版本 >= 8.0、Doctrine ORM版本 >=2.9,才支持Attributes格式的映射写法
- 所有实体类必须添加
#[ORM\Entity]注解,否则会抛出Class "SomeClass" is not a valid entity or mapped super class.异常
内容的提问来源于stack exchange,提问作者Mr Jones
相关产品推荐
相关产品推荐

