为了账号安全,请及时绑定邮箱和手机立即绑定

如何删除关联(many2many)?

如何删除关联(many2many)?

Go
MM们 2022-11-23 19:29:54

发生删除关联的奇怪行为。查询生成了一个我没有添加的额外条件。


type Client struct {

    gorm.Model

    Name        string      `gorm:"unique;not null" validate:"required,min=1,max=30"`

    Kyc_status  string      `gorm:"not null" validate:"required,min=1,max=30"`

    Kyc_remarks string      `gorm:"default:null" validate:"omitempty,min=0,max=200"`

    Operators   []*Operator `gorm:"many2many:client_operators;"`

    Op_ids      []string    `gorm:"-:all" validate:"omitempty,dive,numeric"` // placeholder field, wont be part of table

}

type Operator struct {

    gorm.Model

    Title       string    `gorm:"unique;not null" validate:"required,min=1,max=100"`

    Email       string    `gorm:"not null" validate:"required,email"`

    Mobile      string    `gorm:"not null" validate:"required,min=7,max=15,numeric"`

    Last_online time.Time `gorm:"default:null" validate:"omitempty"`

    Last_ip     string    `gorm:"default:null" validate:"omitempty,ip"`

    Clients     []*Client `gorm:"many2many:client_operators;"`

    Cli_ids     []string  `gorm:"-:all" validate:"omitempty,dive,numeric"`

}


// find operators related to client

var client_query *Client

DBconnection.Where("id = ?", pk).Preload("Operators").First(&client_query)


// delete operators related to client

DBconnection.Model(&Client{}).Where("client_id = ?", pk).Association("Operators").Delete(&client_query.Operators)

我希望删除是:

[2.000ms] [行:0] 从 `client_operators` 中删除,其中 client_id = 5 AND `client_operators`.`operator_id` = 1


或者

[2.000ms] [行:0] 从 `client_operators` 中删除,其中 `client_operators`.`client_id` = 5 AND `client_operators`.`operator_id` = 1


但是它目前确实:

[2.000ms] [行:0] 从 `client_operators` 中删除,其中 client_id = 5 AND `client_operators`.`client_id` IN (NULL) AND `client_operators`.`operator_id` = 1


它添加了“ AND `client_operators`.`client_id` IN (NULL) ”的额外条件


我试过 Association().Clear() 也没有做任何事情。


查看完整描述

1 回答

?
繁华开满天机

TA贡献1528条经验 获得超4个赞

发生这种情况是因为您要传递&Client{}给Model.


查看gorm 文档,您需要首先构建一个有效的客户端,Id如下所示:


type Client struct {

    gorm.Model

    Name        string      `gorm:"unique;not null" validate:"required,min=1,max=30"`

    Kyc_status  string      `gorm:"not null" validate:"required,min=1,max=30"`

    Kyc_remarks string      `gorm:"default:null" validate:"omitempty,min=0,max=200"`

    Operators   []*Operator `gorm:"many2many:client_operators;"`

    Op_ids      []string    `gorm:"-:all" validate:"omitempty,dive,numeric"` // placeholder field, wont be part of table

}

type Operator struct {

    gorm.Model

    Title       string    `gorm:"unique;not null" validate:"required,min=1,max=100"`

    Email       string    `gorm:"not null" validate:"required,email"`

    Mobile      string    `gorm:"not null" validate:"required,min=7,max=15,numeric"`

    Last_online time.Time `gorm:"default:null" validate:"omitempty"`

    Last_ip     string    `gorm:"default:null" validate:"omitempty,ip"`

    Clients     []*Client `gorm:"many2many:client_operators;"`

    Cli_ids     []string  `gorm:"-:all" validate:"omitempty,dive,numeric"`

}


// find operators related to client

var client_query *Client

DBconnection.Where("id = ?", pk).Preload("Operators").First(&client_query)




// delete operators related to client

DBconnection.Model(&Client{ID: pk}).Association("Operators").Delete(&client_query.Operators)


查看完整回答
反对 回复 2022-11-23

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信