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

如何执行嵌套删除 gorm Golang?

如何执行嵌套删除 gorm Golang?

Go
慕无忌1623718 2022-10-10 15:34:05
我有一张带汽车的客户表,而汽车有服务。当我删除汽车时,我还想从数据库中删除服务当我删除客户时,我希望能够删除客户、它的汽车、它的服务。我尝试了以下删除汽车和与汽车相关的服务,但它只从数据库中删除汽车,如何删除汽车及其服务?type Customer struct {    gorm.Model    FirstName string    LastName  string    Phone     string `gorm:"typevarchar(100);unique_index"`    Cars      []Car  `gorm:"constraint:OnDelete:CASCADE;"`}type Car struct {    gorm.Model    Make       string    Modelo     string    Color      string    VinNumber  string     `gorm:"typevarchar(100);unique_index"`    Services   []*Service `gorm:"constraint:OnDelete:CASCADE;"`    CustomerId int}type Service struct {    gorm.Model    Comment string    Miles   string    CarId   int}//endpoints//delete customerfunc deleteCustomer(w http.ResponseWriter, r *http.Request) {    params := mux.Vars(r)    setupResponse(&w, r)    if (*r).Method == "OPTIONS" {        return    }    var customer Customer    db.First(&customer, params["id"])    db.Unscoped().Delete(&customer)    json.NewEncoder(w).Encode(&customer)}func deleteCar(w http.ResponseWriter, r *http.Request) {    setupResponse(&w, r)    if (*r).Method == "OPTIONS" {        return    }    params := mux.Vars(r)    var car Car    db.First(&car, params["id"])    db.Select("Services").Unscoped().Delete(&car)    json.NewEncoder(w).Encode(&car)}我已经尝试了我在 StackOverflow 和文档中看到的大部分内容,但到目前为止似乎没有任何效果。
查看完整描述

1 回答

?
HUWWW

TA贡献1874条经验 获得超12个赞

在阅读了文档和一堆 StackOverflow 答案后,对我来说没什么用。文档和/或 StackOverflow 建议我在迁移模型时添加约束,或/并将约束添加到 structs gorm:"constraint:OnDelete:CASCADE;" ,我也尝试db.Select("cars").Delete(&customers) 过但没有成功。这就是我的做法,不确定这是否是最佳做法,但它会从数据库中删除其相关记录。我像这样更新了 deleteCustomer 和 deleteCar 端点:

//delete customer

func deleteCustomer(w http.ResponseWriter, r *http.Request) {

    params := mux.Vars(r)


    setupResponse(&w, r)

    if (*r).Method == "OPTIONS" {

        return

    }


    var customer Customer

    var cars []Car


    db.First(&customer, params["id"])

    db.Model(&customer).Related(&cars)


    deleteServicesSqlStatement := `

        DELETE FROM services

        WHERE car_id = $1;`


    for i, car := range cars {

        fmt.Println(i, car.ID)

        err := db.Exec(deleteServicesSqlStatement, car.ID).Error

        if err != nil {

            fmt.Println(err)

        }


    }


    DeleteCarsSqlStatement := `

        DELETE FROM cars

        WHERE customer_id = $1;`


    err := db.Exec(DeleteCarsSqlStatement, params["id"]).Error

    if err != nil {

        fmt.Println(err)

    }


    db.Debug().Unscoped().Delete(&customer)

    json.NewEncoder(w).Encode(&customer)


}



//delete car

func deleteCar(w http.ResponseWriter, r *http.Request) {

    //handle CORS

    setupResponse(&w, r)

    if (*r).Method == "OPTIONS" {

        return

    }


    params := mux.Vars(r)


    var car Car

    db.First(&car, params["id"])


    sqlStatement := `

        DELETE FROM services

        WHERE car_id = $1;`


    err := db.Exec(sqlStatement, params["id"]).Error


    if err != nil {

        fmt.Println(err)

    }


    db.Debug().Unscoped().Delete(&car)

    json.NewEncoder(w).Encode(&car)

}



查看完整回答
反对 回复 2022-10-10
  • 1 回答
  • 0 关注
  • 77 浏览
慕课专栏
更多

添加回答

举报

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