其他分享
首页 > 其他分享> > gorm忽略某个字段的存取,在返回前端时增加信息

gorm忽略某个字段的存取,在返回前端时增加信息

作者:互联网

因为这样一个需求,用户的生日可以直接存入数据库,但年龄是跟着时间变的,服务端需要计算结果返回前端,为了省事,直接在结构体定义时增加年龄字段,忽略存取,在json序列化时赋值,不过这样子只是在序列化的时候拿到值,服务端想要使用的话就需要先序列化,如果是 laravel 的话,通过toArray可以直接增加获取的结果字段,目前没有查到gorm更省事的办法。

package main

import (
	"encoding/json"
	"fmt"
	"gorm.io/gorm"
	"time"
)

type User struct {
	Id       int
	Name     string
	Birthday time.Time `gorm:"type:date;"`
	Age      int       `gorm:"-"`
}

func (model User) MarshalJSON() ([]byte, error) {
	// 命名别名,避免MarshalJson死循环
	type Alias User
	model.Age = GetAge(model.Birthday)
	return json.Marshal(struct {
		Alias
	}{Alias(model)})
}

func GetAge(birthday time.Time) int {
	age := 0
	if !birthday.IsZero() {
		y, m, d := birthday.Date()
		nowY, nowM, nowD := time.Now().Date()
		age = nowY - y
		if nowM < m || (nowM == m && nowD < d) {
			age--
		}
	}
	return age
}

var GDB *gorm.DB

func main() {
	GDB = getDB()
	test()
}

func test() {
	GDB.AutoMigrate(&User{})
	user := User{
		Name:     "u1",
		Birthday: time.Date(time.Now().Year()-12, 7, 24, 12, 0, 0, 0, time.Local),
	}
	GDB.Create(&user)
	var fUser User
	GDB.Model(&user).Find(&fUser, user.Id)
	fmt.Printf("%#v\n", fUser)
	mUser, _ := json.Marshal(fUser)
	fmt.Printf("%s", string(mUser))
}

标签:json,GDB,字段,User,time,fUser,存取,gorm
来源: https://www.cnblogs.com/burndust/p/16514616.html