GORM .Save don't save "has one" relation to the database

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?



Comments

Popular posts from this blog

Spring Elasticsearch Operations

Object oriented programming concepts (OOPs)

Spring Boot and Vaadin : Filtering rows in Vaadin Grid