我有一个不寻常的索引,它包括:
some_field
,COALESCE(other_field, 0)
所以我尝试在我的实体的描述中使用它
#[ORM\UniqueConstraint(
name: 'some_index',
columns: ['some_field', 'COALESCE(other_field, 0)']
)]
当然,在运行命令
php bin/console make:migration
或php bin/console doctrine:migrations:diff
时,学说找不到这样的列并返回错误:
There is no column with name "COALESCE(other_field, 0)" on table "..."
是否有任何可能的方法可以继续使用
maker-bundle
或 doctine-bundle
中的命令来生成新的迁移而不会出现此类错误?
不幸的是,Doctrine 不直接在其模式管理中支持像 COALESCE() 这样的复杂 SQL 函数(例如,在生成迁移或实体映射时),因此它将 COALESCE(other_field, 0) 视为列名,因此错误。
您可以手动管理迁移中的自定义索引,否则必须使用忽略 Doctrine Schema 中的索引
php bin/console doctrine:schema:update --dump-sql
如果有人对在执行命令时消除此类错误的想法感兴趣,我意识到为学说的实体添加虚拟财产:
#[ORM\Column(name: 'COALESCE(other_field, 0)', nullable: true, insertable: false, updatable: false)]
private ?string $virtualField = null;
现在它正在生成额外的字段(sql 查询),但没有任何错误。