original idea was to build rbac analog from yii https://github.com/yiisoft/yii2/blob/master/framework/rbac/migrations/schema-pgsql.sql
so, i have these two models:
type AuthItem struct {
ID uint `gorm:"uniqueIndex;primaryKey;auto_increment;column:id" json:"id"`
Name string `gorm:"uniqueIndex;primaryKey;not null;type:varchar(64);column:name" json:"name"`
ItemType int64 `gorm:"type:smallint;not null;column:item_type" json:"item_type"`
Description string `gorm:"size:255;column:description" json:"description"`
}
type AuthRelations struct {
gorm.Model
Parent AuthItem `gorm:"references:id;foreignKey:parent;column:parent" json:"parent"`
Child AuthItem `gorm:"references:id;foreignKey:child;column:child" json:"child"`
}
also i already have some data in auth_items table and i want to make insert into auth_relations table with GORM, and its looks like this:
var relation = models.AuthRelations{
Parent: models.AuthItem{ID: 1},
Child: models.AuthItem{ID: 2},
}
err = db.Save(&relation).Error
if err != nil {
log.Fatalf("cant insert: %v", err)
}
i getting this error:
failed to set value 0x1 to field Parent; failed to set value 0x1 to field Parent
i tried to use gorm function Value(), something like:
func (item AuthItem) Value() (driver.Value, error) {
return int64(item.ID), nil
}
and after i implement this function db.Save works, but the constraints/foreignKeys/references stop working
so my question: is there any options to make relations like this in right way or how can i use value() function without loosing constraints ?
i came to conclusion that i need to use many2many relation and here is example for case:
type AuthItem struct {
ID uint `gorm:"uniqueIndex;primaryKey;auto_increment" json:"id"`
Name string `gorm:"unique;not null;type:varchar(64);column:name" json:"name"`
ItemType int64 `gorm:"type:smallint;not null;column:item_type" json:"item_type"`
Description string `gorm:"size:255;column:description" json:"description"`
CreatedAt time.Time `gorm:"default:CURRENT_TIMESTAMP" json:"created_at"`
UpdatedAt time.Time `gorm:"default:CURRENT_TIMESTAMP" json:"updated_at"`
DeletedAt time.Time `gorm:"default:null" json:"deleted_at"`
}
type AuthRelations struct {
ID uint `gorm:"uniqueIndex;primaryKey;auto_increment" json:"id"`
Parent []AuthItem `gorm:"many2many:prnt_authitem_parent;References:Name;constraint:OnUpdate:CASCADE,OnDelete:SET NULL;" json:"parent"`
Child []AuthItem `gorm:"many2many:chld_authitem_child;References:Name;constraint:OnUpdate:CASCADE,OnDelete:SET NULL;" json:"child"`
CreatedAt time.Time `gorm:"default:CURRENT_TIMESTAMP" json:"created_at"`
UpdatedAt time.Time `gorm:"default:CURRENT_TIMESTAMP" json:"updated_at"`
DeletedAt time.Time `gorm:"default:null" json:"deleted_at"`
}