gorm
gorm copied to clipboard
Is there any Preload equivalent, but to use combined to gorm.Create?
Your Question
Is there any Preload equivalent, but to use combined to gorm.Create? For example, image these structures:
type DocumentType struct {
gorm.Model
Description string `gorm:"type:varchar(20);not null;unique" validate:"required,lte=20"`
}
type Receiver struct {
gorm.Model
Name string `gorm:"type:varchar(100);not null;unique" validate:"required,gte=2,lte=100"`
DocumentTypeID *uint64
DocumentType *document_type.DocumentType
}
we can use the Preload like this, combined to Find, for example:
db.Debug().Preload("DocumentType").Find(&r) // "r" is a type "*Receiver"
so GORM retrieves the inner structure record automatically.
Is there any equivalent, but to use combined to Create? For example, something like this:
db.Debug().Preload("DocumentType").Create(&r)
The document you expected this should be explained
Some topic like Create with inner structures at: https://gorm.io/docs/create.html
Expected answer
It would be awesome if GORM could resolve the inner structure (to find its ID, for example) when creating nested records.
Additional note: also tried using db.Debug().Preload("DocumentType").FirstOrCreate(&r), but also raises an error FOREIGN KEY constraint failed instead of creating the record.
Fixed in my code by adding an additional method FillByDescription to the type DocumentType and calling in BeforeSave from Receiver:
func (r *Receiver) BeforeSave(tx *gorm.DB) (err error) {
if err = validation.Check(r); err == nil && r.DocumentType != nil {
_ = r.DocumentType.FillByDescription() // << HERE
}
return
}
func (r *Receiver) Create() error {
return database.Create(r)
}
Anyway, let me know if we have something like this built-in in GORM.