gorm ORM框架在对我们自定义的结构体进行Sacn数据扫描的时候异常 [error] invalid field found for struct XXX's field Children: define a valid foreign key for relations or implement the Valuer/Scanner interface
原因:
这是因为我们自定义的结构体中包含自己,通常是包含子节点Children , 如分类的子级分类等。
解决方法:
在我们自定义的结构体中包含自己的子节点处增加gorm忽略标签 `gorm:"-"` ,来让gorm在通过结构体来读写数据的时候忽略相关的字段即可。
示例:
注意下面的 Children []*SysMenuExtend `gorm:"-" json:"children,omitempty"` 这里的gorm:"-" 就是gorm的忽略标签,表示在对结构体进行读写时会忽略Children这个字段
// SysMenu is the golang structure for table sys_menu.
type SysMenu entity.SysMenu
// Fill with you ideas below.
type SysMenuExtend struct {
SysMenu
ParentName string `json:"parentName"` // 父菜单名称
Children []*SysMenuExtend `gorm:"-" json:"children,omitempty"` // 子菜单
}
gorm标准数据库表结构体定义 entity.SysMenu 示例
// SysMenu 菜单表
type SysMenu struct {
gorm.Model
Name string `gorm:"column:menu_name;type:varchar(50);not null;comment:菜单名称" json:"menu_name"` // 菜单名称
Pid int64 `gorm:"column:pid;type:bigint(20);comment:父菜单ID" json:"pid"` // 父菜单ID
}
// TableName SysMenu's table name
func (*SysMenu) TableName() string {
return "sys_menu"
}
附 Gorm字段级权限控制
可导出的字段在使用 GORM 进行 CRUD 时拥有全部的权限,此外,GORM 允许您用标签控制字段级别的权限。这样您就可以让一个字段的权限是只读、只写、只创建、只更新或者被忽略
注意: 使用 GORM Migrator 创建表时,不会创建被忽略的字段
type User struct { Name string `gorm:"<-:create"` // 允许读和创建 Name string `gorm:"<-:update"` // 允许读和更新 Name string `gorm:"<-"` // 允许读和写(创建和更新) Name string `gorm:"<-:false"` // 允许读,禁止写 Name string `gorm:"->"` // 只读(除非有自定义配置,否则禁止写) Name string `gorm:"->;<-:create"` // 允许读和写 Name string `gorm:"->:false;<-:create"` // 仅创建(禁止从 db 读) Name string `gorm:"-"` // 通过 struct 读写会忽略该字段 Name string `gorm:"-:all"` // 通过 struct 读写、迁移会忽略该字段 Name string `gorm:"-:migration"` // 通过 struct 迁移会忽略该字段 } |