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.

Comment From: silvioprog

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.

Comment From: silvioprog

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.