第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

如何刪除 Gorm 中關(guān)系的相關(guān)模型?

如何刪除 Gorm 中關(guān)系的相關(guān)模型?

Go
月關(guān)寶盒 2023-02-06 11:21:59
所以基本上我有 3 個(gè)模型:User、Profile和Post。它們是這樣相關(guān)的:User 有一個(gè) Profile. Profile 有很多 Post它們看起來像這樣:type User struct {    Base             // holds this object's uuid, createdAt, updatedAt    Role     string  `json:"role"`    Username string  `json:"username" gorm:"unique"`    Password string  `json:"password"`    Profile  Profile `gorm:"constraint:OnDelete:CASCADE;"`}type Profile struct {    Base          // holds this object's uuid, createdAt, updatedAt    UserId string `json:"user_id"`    Name   string `json:"name"`    Bio    string `json:"bio"`    Age    uint8  `json:"age"`    Posts  []Post `gorm:"constraint:OnDelete:CASCADE;"`}type Post struct {    Base             // holds this object's uuid, createdAt, updatedAt    ProfileId string `json:"profile_id"`    Caption   string `json:"caption"`    Likes     uint32 `json:"num_likes" gorm:"default:0"`}我想要發(fā)生的是當(dāng)我刪除用戶時(shí),我希望刪除配置文件以及與之相關(guān)的所有帖子。我對(duì)關(guān)系數(shù)據(jù)庫的唯一其他經(jīng)驗(yàn)是 Django,它是自動(dòng)的。實(shí)際發(fā)生的情況是,當(dāng)我刪除用戶時(shí),配置文件被刪除,但帖子仍保留在數(shù)據(jù)庫中。這就是我刪除用戶的方式:...base := models.Base{Id: id}if err := configs.Database.Select(clause.Associations).Delete(&models.User{Base: base}).Error; err != nil {    return c.Status(400).JSON(err.Error())}...我已經(jīng)看過這個(gè)但它不是很有幫助。我怎么能做到這一點(diǎn)?謝謝你!
查看完整描述

1 回答

?
尚方寶劍之說

TA貢獻(xiàn)1788條經(jīng)驗(yàn) 獲得超4個(gè)贊

根據(jù)您發(fā)布的問題鏈接和其他相關(guān)問題,可能無法clause.Associations用于嵌套超過一層的關(guān)系。在你的情況下,Profile與你相關(guān)的User被刪除,但Post與 相關(guān)的 s沒有被刪除Profile。


刪除所有想要的關(guān)聯(lián)的一種方法是使用刪除掛鉤。要么 要么BeforeDelete,AfterDelete取決于您的設(shè)置以及您的關(guān)系有多牢固。例如:


func (u *User) BeforeDelete(tx *gorm.DB) (err error) {

  if err := tx.Joins("profiles p ON p.id = posts.profile_id").Joins("users u ON u.id = p.user_id").Where("u.id = ?", u.Base.Id).Delete(&Post{}).Error; err != nil {

    return err

  } 

  return  tx.Joins("users u ON u.id = profiles.user_id").Where("u.id = ?", u.Base.Id).Delete(&Profile{}).Error

}

這樣,當(dāng)你執(zhí)行時(shí)configs.Database.Delete(&models.User{Base: base}),它會(huì)先執(zhí)行鉤子,然后再執(zhí)行這個(gè)查詢。


另一種方法是分別執(zhí)行掛鉤函數(shù)中的所有查詢:


base := models.Base{Id: id}

if err := configs.Database.Joins("profiles p ON p.id = posts.profile_id").Joins("users u ON u.id = p.user_id").Where("u.id = ?", base.Id).Delete(&Post{}).Error; err != nil {

    return c.Status(400).JSON(err.Error())

}


if err := configs.Database.Joins("users u ON u.id = profiles.user_id").Where("u.id = ?", base.Id).Delete(&Profile{}).Error; err != nil {

    return c.Status(400).JSON(err.Error())

}


if err := configs.Database.Delete(&models.User{Base: base}).Error; err != nil {

    return c.Status(400).JSON(err.Error())

}


查看完整回答
反對(duì) 回復(fù) 2023-02-06
  • 1 回答
  • 0 關(guān)注
  • 257 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)