我有两个实体:Organization和OfficeLocation,其中一个Organization可以有多个OfficeLocation。
每个OfficeLocation都可以有自己的昵称,该昵称在组织内必须是唯一的。
这让我觉得应该有一个**@Unique约束,由nickName和organization组成。
问题是:我如何在OfficeLocation实体中声明它?查看mikro-orm文档,我了解到可以在实体级或属性级定义@Unique**约束。
如果我在属性级别声明,我将创建一个约束,该约束将阻止我包含来自另一个组织的办公室位置,该办公室位置与属于另一个组织的现有办公室位置具有相同的昵称,对吗?
@Unique()
public nickName!: string;
那么,声明这个约束的正确方法应该是这样的?
@Entity()
@Unique({ properties: ['nickName', 'organization'] })
export class OfficeLocation {
@Property()
@Unique()
public nickName!: string;
// all the other fields...
@ManyToOne(() => Organization)
public organization!: Organization;
}
2条答案
按热度按时间bvuwiixz1#
如果知道其中一个字段本身是唯一的,那么在两个字段上使用复合唯一约束的目的是什么?换句话说,如果
nickName
已经是唯一的,那么即使向该约束添加任何其他列,它也是唯一的。两者都对我来说没有多大意义。nick & orgid上的复合约束本身意味着两个位置可以具有相同的昵称。因此,如果您希望具有唯一的昵称,请保持属性级别为1。如果您希望允许表级别上的重复,但不允许组织内部的重复,则应仅保留复合索引并删除属性级别1。
sbdsn5lh2#
您只需从
nickname
中删除属性级@unique
,并保留实体级@unique
,就像您在示例中所做的那样。它能满足你的需求