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

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

如何使用 gorm 創(chuàng)建記錄時(shí)驗(yàn)證所屬關(guān)系

如何使用 gorm 創(chuàng)建記錄時(shí)驗(yàn)證所屬關(guān)系

Go
倚天杖 2022-08-01 09:53:09
我有以下型號(hào)type PrivateGormModel struct {    ID        uint       `gorm:"primary_key" json:"id"`    CreatedAt time.Time  `json:"-"`    UpdatedAt time.Time  `json:"-"`    DeletedAt *time.Time `json:"-"`}type Employee struct {    PrivateGormModel    Person          `gorm:"embedded" json:"person,omitempty"`    Contact         `gorm:"embedded" json:"contact,omitempty"`    Address         `gorm:"embedded" json:"address,omitempty"`    AltContact      `gorm:"embedded" json:"privateContact,omitempty"`    BankAccount     `gorm:"embedded" json:"bankAccount,omitempty"`    EmployeeGroupID uint `json:"groupID"`    EmployeeGroup   `json:"group"`    EmployeeRoleID  uint `json:"roleID"`    EmployeeRole    `json:"role"`}func (e Employee) Validate() error {    return validation.ValidateStruct(&e,        validation.Field(&e.Person, validation.Required),        validation.Field(&e.Contact),        validation.Field(&e.Address),        validation.Field(&e.AltContact),        validation.Field(&e.BankAccount),        validation.Field(&e.EmployeeGroup),        validation.Field(&e.EmployeeRole),    )}type EmployeeGroup struct {    PrivateGormModel    Title string `json:"title" gorm:"primaryKey;unique"`}func (e EmployeeGroup) Validate() error {    return validation.ValidateStruct(&e,        validation.Field(&e.Title, validation.Required, validation.Length(1, 32), validation.Match(regexp.MustCompile(`^[a-zA-Z0-9_ ]*$`))),    )}type EmployeeRole struct {    PrivateGormModel    Title string `json:"title" gorm:"primaryKey;unique"`}func (e EmployeeRole) Validate() error {    return validation.ValidateStruct(&e,        validation.Field(&e.Title, validation.Required, validation.Length(1, 32), validation.Match(regexp.MustCompile(`^[a-zA-Z0-9_ ]*$`))),    )}
查看完整描述

1 回答

?
天涯盡頭無(wú)女友

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

如何建立關(guān)系并不明顯,因?yàn)樗坪跄跒?EmployeeGroup 和 EmployeeRole 使用匿名嵌入式結(jié)構(gòu),并且您尚未包含這些結(jié)構(gòu)的代碼。我將假設(shè)您已經(jīng)正確設(shè)置了它,并且gorm很樂(lè)意處理涉及匿名嵌入式結(jié)構(gòu)的關(guān)系。

我還假設(shè)您指的是 BelongsTo 關(guān)系,否則您將在哪里放置外鍵以將 Employee 表與角色或組表鏈接起來(lái)?很明顯,外鍵不在最后兩個(gè)中。

因此,您已經(jīng)獲得了一個(gè) Employee 結(jié)構(gòu),當(dāng)給定無(wú)效的 GroupID 或 RoleID 時(shí),您有兩種選擇:在 ID 不存在時(shí)拒絕操作,或者使用給定的 ID 創(chuàng)建新的角色/組。第一個(gè)是更理智和通常的處理事情的方式,但gorm也可以做到。

對(duì)于第一個(gè),如果您的數(shù)據(jù)庫(kù)中有外鍵檢查,則可以執(zhí)行以下操作:

// First make sure that EmployeeRoleID and EmployeeGroupID are set 
err := db.Omit("EmployeeRole", "EmployeeGroup").Create(employee).Error

如果 EmployeeGroup.ID 或 EmployeeRole.ID 不存在,則會(huì)發(fā)生外鍵沖突,并且您將收到錯(cuò)誤。您可以檢查錯(cuò)誤并推斷出它與外鍵有關(guān),然后返回相應(yīng)的 API 級(jí)錯(cuò)誤。

您可能會(huì)發(fā)現(xiàn)此錯(cuò)誤檢查有點(diǎn)麻煩,具體取決于您使用的數(shù)據(jù)庫(kù)。老實(shí)說(shuō),在保存實(shí)體之前觸發(fā)一堆額外的關(guān)系驗(yàn)證查詢是非常常見(jiàn)的,所以在這種情況下,不要對(duì)必須這樣做感到驚訝。

另一方面,如果每次都想保存新的角色和組,則可以刪除省略調(diào)用,確保每個(gè) ID 為零,然后調(diào)用 Create。Gorm 將保存角色和組,為他們提供新 ID,然后在員工記錄中保存指向這些新 ID 的鏈接。


編輯

我嘗試運(yùn)行您的代碼,并發(fā)現(xiàn)了一些問(wèn)題:

  • 首先,您的輸入 JSON 具有所有 TitleCased 鍵名,但模型結(jié)構(gòu)希望其中很多鍵名都是小寫(xiě)的。你需要決定其中一個(gè)并堅(jiān)持下去,否則編組和取消marshaling將不起作用。

  • 這同樣適用于 / vs /。在 JSON 中具有一個(gè)版本的名稱,在 Go 結(jié)構(gòu)中具有一個(gè)版本(如果刪除了標(biāo)記,它們也可以全部是相同的 TitleCased 版本)。EmployeeRoleIDEmployeeGroupIDgroupIDroleIDjson:"blah"

  • Gorm不喜歡為相關(guān)實(shí)體嵌入匿名結(jié)構(gòu),它不會(huì)為它們創(chuàng)建外鍵,而是在主表中創(chuàng)建無(wú)關(guān)的字段,不要這樣做。

  • 您已將 Role 和 Group 的名稱用作復(fù)合主鍵的一部分,但這會(huì)中斷鍵控,因?yàn)槟枰谥鹘Y(jié)構(gòu)中顯示兩個(gè)字段才能使其正常工作,例如 和 ,這違背了擁有單獨(dú)實(shí)體的目的。如果要在名稱中強(qiáng)制實(shí)施唯一性,請(qǐng)改為添加唯一索引。EmployeeGroupIDEmployeeGroupName

  • 事實(shí)證明,這僅適用于多對(duì)多關(guān)系。對(duì)于屬于 - 要做的是填寫(xiě)主結(jié)構(gòu)中的字段,并省略與 的關(guān)系。Omit("Relation.*")RelationIDOmit("Relation")

下面是有效的模型的簡(jiǎn)化版本:

type Employee struct {

    PrivateGormModel

    Person  `gorm:"embedded" json:"Person"`

    // ...

    RoleID  uint

    Role    EmployeeRole `gorm:"constraint:OnUpdate:CASCADE,OnDelete:SET NULL;"`

}


type EmployeeRole struct {

    PrivateGormModel

    Title string `gorm:"uniqueIndex"`

}

下面是一個(gè)測(cè)試用例,它顯示了它是如何工作的,假設(shè)有一個(gè)配置的:DB *gorm.DB


package main


import (

    "encoding/json"

    "testing"


    "github.com/stretchr/testify/require"

)


var inJSON = `{

    "Person": {

        "FirstName": "Test"

    },

    "RoleID": 1

}`


func TestGORM(t *testing.T) {

    require := require.New(t)

    require.NoError(DB.Migrator().DropTable(&Employee{}, &EmployeeRole{}))

    require.NoError(DB.Migrator().AutoMigrate(&Employee{}, &EmployeeRole{}))

    emp := Employee{}

    json.Unmarshal([]byte(inJSON), &emp)


    // create the role to simulate that it exists

    role := EmployeeRole{PrivateGormModel{ID: 1}, "Test"}

    require.NoError(DB.Create(&role).Error)


    // avoid re-saving emp.Role

    require.NoError(DB.Omit("Role").Create(&emp).Error)


    // if instead the RoleID doesn't exist

    emp.RoleID = 5

    require.Error(DB.Create(&emp).Error)

}


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

添加回答

舉報(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)