gorm数据库define a valid foreign key for relations or implement the Valuer/Scanner interface异常解决方法

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 迁移会忽略该字段
}

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值