亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何執行嵌套刪除 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 關注
  • 115 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號