我有以下相關表格:type Person struct { ID uint64 `json:"id" gorm:"primary_key;auto_increment"` Name string `json:"name"` Surname string `json:"surname"`}type Book struct { ID uint64 `json:"id" gorm:"primary_key;auto_increment"` Title string `json:"title" binding:"required,min=2,max=100" gorm:"type:varchar(100)"` Author Person `json:"author" binding:"required" gorm:"foreignkey:AuthorID"` // * here AuthorID uint64 `json:"-"` // * here WrittenIn string `json:"written_in" gorm:"type:varchar(5)"` CreatedAt time.Time `json:"created_at" gorm:"default:CURRENT_TIMESTAMP"` UpdatedAt time.Time `json:"updated_at" gorm:"default:CURRENT_TIMESTAMP"`}我可以通過使用此功能的Create()方法成功創建數據:gormfunc CreateBook(ctx *gin.Context) { // validating input var inputData CreateBookInput if err := ctx.ShouldBindJSON(&inputData); err != nil { ctx.JSON(401, gin.H{"status": "fail", "error": err.Error()}) } // create book book := models.Book{Title: inputData.Title, AuthorID: inputData.AuthorID, WrittenIn: inputData.WrittenIn} database.DB.Create(&book).Preload("Author") // database.DB.Preload("Author").Create(&book) // database.DB.Set("gorm:auto_preload", true).Create(&book) ctx.JSON(201, gin.H{"status": "success", "book": book})}我想把新創作的書連同它的作者一起歸還。預期響應:"book": { "id": 10, "title": "Chinor ostidagi duel", "author": { "id": 3, "name": "John", "surname": "Smith" }, "written_in": "1983", "created_at": "2022-01-07T17:07:50.84473824+05:00", "updated_at": "2022-01-07T17:07:50.84473824+05:00"}但我找不到填充相關“作者”的方法。所以我得到的是:"book": { "id": 10, "title": "Chinor ostidagi duel", "author": { "id": 0, // empty "name": "", // empty "surname": "" // empty },如何填充新創建數據的相關字段?
2 回答

開滿天機
TA貢獻1786條經驗 獲得超13個贊
Preload是鏈式方法,Create是finisher方法。只有finisher 方法會生成并執行SQL。
所以...
1 創建書后按id查找作者
if err ;= database.DB.Create(&book).Error; err != nil {
return err
}
// will not throw not found error
database.DB.Limit(1).Find(&book.Author, book.AuthorID)
ctx.JSON(201, gin.H{"status": "success", "book": book})
2 每次加載作者數據,使用鉤子
// create and update
// func (b *Book) AfterSave(tx *gorm.DB) (err error) {
// just create
func (b *Book) AfterCreate(tx *gorm.DB) (err error) {
// handle error if you want
tx.Limit(1).Find(&b.Author, b.AuthorID)
return
}
- 2 回答
- 0 關注
- 223 瀏覽
添加回答
舉報
0/150
提交
取消