我有以下型号
type TenantUser struct {
TenantID uint `json:"tenantId" gorm:"primaryKey; uniqueIndex:idx_name_and_tenant; uniqueIndex:idx_email_and_tenant"`
UserID uuid.UUID `json:"-" gorm:"primaryKey; type:uuid"`
...
Visited []*TenantUser `json:"visited" gorm:"many2many:visitors; foreignKey:TenantID,UserID; references:TenantID,UserID; joinForeignKey:visitor_tenant_id,visitor_user_id; joinReferences:visitee_tenant_id,visitee_user_id"`
Visitors []*TenantUser `json:"visitors" gorm:"many2many:visitors; foreignKey:TenantID,UserID; references:TenantID,UserID; joinForeignKey:visitee_tenant_id,visitee_user_id; joinReferences:visitor_tenant_id,visitor_user_id"`
}
这会生成以下 sql
create table visitors
(
visitor_tenant_id bigint not null unique,
visitor_user_id uuid not null,
visitee_tenant_id bigint not null unique,
visitee_user_id uuid not null,
primary key (visitor_tenant_id, visitor_user_id, visitee_tenant_id, visitee_user_id),
constraint fk_visitors_tenant_user foreign key (visitor_tenant_id, visitor_user_id) references tenant_users,
constraint fk_visitors_visited foreign key (visitee_tenant_id, visitee_user_id) references tenant_users
);
我不明白为什么
visitor_tenant_id
和 visitee_tenant_id
被定义为唯一的。但更重要的是,我该如何预防?
如果我执行如下代码,并且具有不同的访问者,则仅添加第一个访问者。再做一遍就没有任何作用。它甚至没有给出错误。如果我手动从数据库中删除唯一索引,一切都会按预期进行。
db.Model(&visitee.TenantUser).Association("Visitors").Append([]*model.TenantUser{visitor})
知道发生了什么事吗?
从
uniqueIndex
结构中的 TenantID
字段中删除 TenantUser
标签,然后重新生成数据库架构。
type TenantUser struct {
TenantID uint `json:"tenantId" gorm:"primaryKey"`
UserID uuid.UUID `json:"-" gorm:"primaryKey; type:uuid"`
...
Visited []*TenantUser `json:"visited" gorm:"many2many:visitors; foreignKey:TenantID,UserID; references:TenantID,UserID; joinForeignKey:visitor_tenant_id,visitor_user_id; joinReferences:visitee_tenant_id,visitee_user_id"`
Visitors []*TenantUser `json:"visitors" gorm:"many2many:visitors; foreignKey:TenantID,UserID; references:TenantID,UserID; joinForeignKey:visitee_tenant_id,visitee_user_id; joinReferences:visitor_tenant_id,visitor_user_id"`
}