Home > front end >  GORM .Save don't save "has one" relation to the database
GORM .Save don't save "has one" relation to the database

Time:06-30

I have struct:


type Book struct {
    gorm.Model
    Title       string      `json:"title"`
    Author      string      `json:"author"`
    Description string      `json:"description"`
    Category    string      `json:"Category"`
    Publisher   string      `json:"publisher"`
    AuthorsCard AuthorsCard `gorm:"foreignKey:BookID" json:"authorscard"`
}

type AuthorsCard struct {
    //gorm.Model   // I purposely Don't want to use gorm.model  
    ID          uint `gorm:"primarykey"`
    BookID      uint
    Name        string `json:"name"`
    Age         int    `json:"age"`
    YearOfBirth int    `json:"year"`
    Biography   string `json:"biography"`
}

And I'm trying to make update function:

// controller.go
func UpdateBook(ctx *gin.Context) {
    enableCors(&ctx.Writer)
    id := ctx.Param("ID")
    var updateBook = &models.Book{}
    if err := ctx.BindJSON(updateBook); err != nil {
        ctx.AbortWithStatus(http.StatusBadRequest)
        log.Fatal(err)
    } else {
        repository.UpdateBook(updateBook, id)
        ctx.JSON(http.StatusOK, updateBook)
        log.Println(updateBook)
    }
}
//repository.go
func UpdateBook(updateBook *models.Book, ID string) {
    book, db := GetBookById(ID)
    if updateBook.Title != "" {
        book.Title = updateBook.Title
    }

    if updateBook.Author != "" {
        book.Author = updateBook.Author
    }

    if updateBook.Publisher != "" {
        book.Publisher = updateBook.Publisher
    }
    if updateBook.Description != "" {
        book.Description = updateBook.Description
    }
    if updateBook.Category != "" {
        book.Category = updateBook.Category
    }

    if updateBook.AuthorsCard.Name != "" {
        book.AuthorsCard.Name = updateBook.AuthorsCard.Name
    }
    if updateBook.AuthorsCard.Age != 0 {
        book.AuthorsCard.Age = updateBook.AuthorsCard.Age
    }
    if updateBook.AuthorsCard.YearOfBirth != 0 {
        book.AuthorsCard.YearOfBirth = updateBook.AuthorsCard.YearOfBirth
    }
    if updateBook.AuthorsCard.Biography != "" {
        book.AuthorsCard.Biography = updateBook.AuthorsCard.Biography
    }

    db.Save(&book)
    // same with db.Preload("AuthorsCard").Save(&book)
}

The issue is: When I make an PUT request, I receive Fully updated data. And when I'm trying to make GET request all my fields, except related AuthorsCard, are been updated.

PUT response: 200 Code

{
    "ID": 0,
    "CreatedAt": "0001-01-01T00:00:00Z",
    "UpdatedAt": "0001-01-01T00:00:00Z",
    "DeletedAt": null,
    "title": "Test",
    "author": "author",
    "description": "something",
    "Category": "Category",
    "publisher": "PB",
    "authorscard": {
        "ID": 0,
        "BookID": 0,
        "name": "Updated",
        "age": 22,
        "year": 1999,
        "biography": "biography Updated"
    }
}

Get response after that:

[
    {
        "ID": 1,
        "CreatedAt": "2022-06-29T14:57:37.489639 03:00",
        "UpdatedAt": "2022-06-29T15:50:11.578724 03:00",
        "DeletedAt": null,
        "title": "Test",
        "author": "author",
        "description": "something",
        "Category": "Category",
        "publisher": "PB",
        "authorscard": {
            "ID": 1,
            "BookID": 1,
            "name": "test",
            "age": 23,
            "year": 1999,
            "biography": "23fdgsdddTEST"
        }
    }
]

As you can see "authorscard" hasn't changed. Please, can someone tell me what I'm doing wrong?

CodePudding user response:

You need to explicitly tell Gorm to store/update associations.

db.Session(&gorm.Session{FullSaveAssociations: true}).Updates(&book)
  • Related