manav Jain
manav Jain

Reputation: 71

How to update the nested tables in sql using gorm?

Here the code is written in Go. I am using two tables where one table has a foreign key that refers to the other table's primary key. Let's say I have a database as following struct defined:

   type User struct{
       ID uint `gorm:"primary_key;column:id"`
       Name string `gorm:"column:name"`
       Place place
       PlaceID
   }

   type Place struct{
       ID uint `gorm:"primary_key;column:id"`
       Name string `gorm:"column:name"`
       Pincode uint `gorm:"column:pincode"`
   }

And the sql schema is:

create table place(
    id int(20) NOT NULL AUTO_INCREMENT,
    name varchar(100) NOT NULL,
    pincode uint(20) NOT NULL,
    PRIMARY KEY (id),
)

create table user(
    id int(20) NOT NULL AUTO_INCREMENT,
    name varchar(100) NOT NULL,
    place_id uint(20) NOT NULL,
    PRIMARY KEY (id),
    FOREIGN KEY (place_id) REFERENCES place(id)
)

Now while inserting in user by gorm as:

  place := Place{Name:"new delhi",Pincode:1234}
  user := User{Name: "sam", Age: 15, Place: place}
  err = db.Debug().Create(&user).Error

  //It  inserts to both user and place table in mysql
  //now while updating to name in user table as Samuel and place as 
  //following

  place := Place{Name:"mumbai",Pincode:1234}
  err = db.Debug().Model(&User{}).Where("id =?", 
   1,).Update(&user{Name:"Samuel",Place:place}).Error

It updates the row in user table but creates a new row in place table.But it should update the matching row in place table and not create a new one

Is there any way to do it? Here I am not using auto migrate function to create db tables.

Upvotes: 4

Views: 3451

Answers (2)

Liubomyr Mykhalchyshyn
Liubomyr Mykhalchyshyn

Reputation: 155

The answer to your question should be sought in a relations or Association Mode. The example below shows how to add new associations for many to many, has many, replace current associations for has one, belongs to

db.Model(&user).Association("Place").Append(Place{Name:"mumbai",Pincode:1234})

Or you can replace current associations with new ones:

db.Model(&user).Association("Place").Replace(Place{Name:"mumbai",Pincode:1234},Place{Name:"new delhi",Pincode:1234})

Upvotes: 1

alexrocco
alexrocco

Reputation: 63

Probably It's creating a new row because you didn't set the ID on Place{Name:"mumbai",Pincode:1234}.

Upvotes: 0

Related Questions