ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2022-07-24 16:06:48  阅读:236  来源: 互联网

标签:json GDB 字段 User time fUser 存取 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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有