猿问

如何执行嵌套删除 gorm Golang?

我有一张带汽车的客户表,而汽车有服务。当我删除汽车时,我还想从数据库中删除服务当我删除客户时,我希望能够删除客户、它的汽车、它的服务。

我尝试了以下删除汽车和与汽车相关的服务,但它只从数据库中删除汽车,如何删除汽车及其服务?

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 customer

func 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 和文档中看到的大部分内容,但到目前为止似乎没有任何效果。



慕无忌1623718
浏览 78回答 1
1回答

HUWWW

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

相关分类

Go
我要回答