一个客户有很多角色。我想在删除客户端后删除所有角色。
type Client struct {
Id string `gorm:"primaryKey"`
CreatedAt time.Time
UpdatedAt time.Time
Roles [] Role
}
type Role struct {
Id uint `gorm:"primarykey"`
CreatedAt time.Time
UpdatedAt time.Time
ClientID string
}
return db.Transaction(func(tx *gorm.DB) error {
err = db.Model(&clientToRemove).Association("Roles").Delete(&clientToRemove.Roles)
if err != nil {
return err
}
err = db.Delete(&clientToRemove).Error
if err != nil {
return err
}
return nil
})
我希望删除角色中的相关行,而不是删除查询,而是执行更新查询来删除 client_id。
[210.834ms] [rows:1] UPDATE "role" SET "client_id"=NULL WHERE "role"."client_id" = 'xxxxxxxxxxx' AND "role"."id" = 9
如何完全删除关联角色表中的行?
数据库是Postgres
如文档中所述,关联删除操作只会删除
Client
和TenantRole
之间的引用。在您的情况下,它只是更新了 TenantRole
记录以将 client_id
设置为 NULL。
如果您也想删除对象,可以尝试使用
Select
进行删除操作。请注意,这仅在主键不为零时才有效,因此您的查询可能如下所示:
err = db.Select("TenantRoles").Delete(&Client{Id: clientId}).Error
或者如果已经填充了
clientToRemove
字段,则只需使用 Id
err = db.Select("TenantRoles").Delete(&clientToRemove).Error
使用
Unscoped()
。如文档中所述。
使用 Unscoped 修改删除行为
对于需要实际删除关联记录的场景,Unscoped 方法会改变此行为。
- 软删除:将关联记录标记为已删除(设置deleted_at字段),而不将它们从数据库中删除。
db.Model(&user).Association("Languages").Unscoped().Clear()
- 永久删除:从数据库中物理删除关联记录。
// db.Unscoped().Model(&user) db.Unscoped().Model(&user).Association("Languages").Unscoped().Clear()