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

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

關(guān)系數(shù)據(jù)庫(kù)導(dǎo)致循環(huán)

關(guān)系數(shù)據(jù)庫(kù)導(dǎo)致循環(huán)

Go
守著星空守著你 2022-11-28 17:00:28
我有以下層次結(jié)構(gòu),用戶 -> 地圖 -> 元素 -> 帖子 一個(gè)用戶可以有一堆地圖,每個(gè)地圖都有一些元素,每個(gè)元素都有一些帖子。輸入用戶結(jié)構(gòu){UserID        uint   `gorm:"primarykey;autoIncrement;not_null"`UserName string `json: user_name`FirstName string `json: first_name`LastName  string `json: last_name`Email     string `json:email`Password  []byte `json:"-"`Phone     string `json:"phone"`Maps []Map `gorm:"-"`}類型地圖結(jié)構(gòu){MapID   uint      `gorm:"primarykey;autoIncrement;not_null"`UserID   uint    `json:userid`User     User      `json:"user"; gorm:"foreignkey:UserID`Title    string    `json:title`Desc     string    `json: "desc"`Elements []Element `gorm:"foreignKey:MapID"`Date     time.Time `json: date`}類型元素結(jié)構(gòu){ElementID   uint       `gorm:"primarykey;autoIncrement;not_null"`ElementName string     `json: element_name`Desc        string     `json: desc`MapID uint `json:mapid`Map   Map   `json:"map"; gorm:"foreignkey:MapID`Posts       []Post     `gorm:"foreignKey:ElementID"`Date        time.Time  `json: date`UserID uint `json:userid`User   User   `json:"user"; gorm:"foreignkey:UserID`}輸入 Post 結(jié)構(gòu) {PostId    uint      `gorm:"primarykey;autoIncrement;not_null"`Title     string    `json: p_title`Subject   string    `json: subject`Date      time.Time `json: date`Entry     string    `json: entry_text`ElementID uint `json:elementid`Element   Element   `json:"element"; gorm:"foreignkey:ElementID`UserID uint `json:userid`User   User   `json:"user"; gorm:"foreignkey:UserID`}這一切似乎工作正常,但現(xiàn)在當(dāng)我從后端發(fā)送 JSON 響應(yīng)時(shí),似乎有可能出現(xiàn)無(wú)限循環(huán)。當(dāng)我檢索所有用戶的地圖時(shí),它會(huì)列出與創(chuàng)建地圖的用戶相關(guān)的用戶對(duì)象,但地圖隨后還包含一個(gè)元素列表,并且在元素對(duì)象中它將列出它所屬的地圖和該地圖對(duì)象將再次列出它的所有元素。那么我應(yīng)該通過(guò)在一個(gè)方向上預(yù)加載層次結(jié)構(gòu)來(lái)處理這個(gè)問(wèn)題嗎?var getmaps []models.Map database.DB.Preload("User").Preload("Map").Preload("Elements").Offset(偏移).Limit(限制).Find(&getmaps)或者我應(yīng)該修復(fù) struct 和 gorm 設(shè)置以僅在一個(gè)方向上獲得關(guān)系?因?yàn)榉祷匾粋€(gè)地圖將返回它的元素,每個(gè)元素將返回它所屬的地圖,循環(huán)回到它的元素等。這個(gè)循環(huán)也會(huì)發(fā)生在元素和帖子中,其中一個(gè)元素將有很多帖子,這些帖子對(duì)象將顯示其元素,而該元素對(duì)象將顯示其帖子。我確信有一種理想或最佳的方式來(lái)實(shí)現(xiàn)這一點(diǎn),所以只是好奇人們會(huì)推薦什么。
查看完整描述

1 回答

?
白板的微信

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

在您的Post,Map和Element結(jié)構(gòu)中,您具有以下字段:


UserID uint   `json:userid`

User   User   `json:"user"; gorm:"foreignkey:UserID`

您應(yīng)該User從內(nèi)容結(jié)構(gòu)中刪除該字段,因?yàn)槟呀?jīng)有一個(gè)UserID. 在這種情況下,“引用”(ID) 比包括整個(gè)用戶對(duì)象更明智。如果需要,客戶端可以調(diào)用/users/{id}端點(diǎn)并查找更多信息。


還User通過(guò)刪除限制結(jié)構(gòu)的內(nèi)容Maps []Map(負(fù)責(zé)您提到的循環(huán))。然后您需要設(shè)置端點(diǎn),/user/{id}/maps以便客戶端可以獲取用戶的內(nèi)容。


這同樣適用于Post和Element。您可以全力以赴只存儲(chǔ) ID,也可以只存儲(chǔ)一組“子”模型。(地圖嵌入元素,元素不嵌入地圖)。因此,要查找元素的關(guān)聯(lián)映射,您可以調(diào)用 endpoint /maps/{your element's map ID}。Element > Post 相同


type Map struct {

    gorm.Model // this takes care of the ID field

    UserID   uint    `json:userid`

    Title    string    `json:title`

    Desc     string    `json: "desc"`

    Elements []Element // gorm will handle the relationship automatically

    Date     time.Time `json: date`

}

type Element struct {

gorm.Model // includes ID

ElementName string     `json: element_name`

Desc        string     `json: desc`

MapID uint `json:mapid`

// Map   Map  ... This relationship is described by another endpoint - /elements/{elementId}/map to get the related map


Posts       []Post     // gorm handles this

Date        time.Time  `json: date`

UserID uint `json:userid`

}

type Post struct {

    gorm.Model

    Title     string    `json: p_title`

    Subject   string    `json: subject`

    Date      time.Time `json: date`

    Entry     string    `json: entry_text`

    ElementID uint `json:elementid` // gorm will use this as fk

    UserID uint `json:userid`

}

為避免循環(huán),您需要在結(jié)構(gòu)級(jí)別使關(guān)系成為單向的,并設(shè)置更多的 http 路由以朝另一個(gè)方向發(fā)展(請(qǐng)參閱注釋代碼)。


我描述的是一個(gè)簡(jiǎn)單的 REST api。微軟有一個(gè)很好的概述:https ://learn.microsoft.com/en-us/azure/architecture/best-practices/api-design#organize-the-api-design-around-resources - 特別是客戶/訂單關(guān)系你會(huì)感興趣的。


在 gorm 方面,您將使用一對(duì)多關(guān)聯(lián):https ://gorm.io/docs/has_many.html


查看完整回答
反對(duì) 回復(fù) 2022-11-28
  • 1 回答
  • 0 關(guān)注
  • 96 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號(hào)

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