这是我的代码:
package main
import (
"fmt"
"time"
"github.com/jinzhu/gorm"
_ "github.com/jinzhu/gorm/dialects/sqlite"
)
type ClientCustomer struct {
Id int `json:"Id"`
Name string
Created time.Time
key string
UserId int `gorm:"user_id"`
Modified time.Time
}
func (ClientCustomer) TableName() string {
return "Client_customer"
}
type ClientCustomerInvitation struct {
Id int
CustomerId int `gorm:"customer_id"`
CodeInvitationId int `gorm:"codeinvitation_id"`
}
func (ClientCustomerInvitation) TableName() string {
return "Client_customer_invitation"
}
func main() {
db, err := gorm.Open("sqlite3", "db.sqlite3?cache=shared&mode=rwc")
if err != nil {
panic("failed to connect database")
}
defer db.Close()
var clientCustomer ClientCustomer
rows, err := db.Model(&ClientCustomer{}).Rows()
defer rows.Close()
if err != nil {
panic(err)
}
var clientCustomerInvitation ClientCustomerInvitation
for rows.Next() {
db.ScanRows(rows, &clientCustomer)
db.First(&clientCustomerInvitation, "customer_id = ?", clientCustomer.Id)
fmt.Println(clientCustomer)
fmt.Println(clientCustomerInvitation)
}
}
但我不喜欢这一行:
db.First(&clientCustomerInvitation, "customer_id = ?", clientCustomer.Id)
有没有一种方法可以直接从结构中调用“ customer_id”而不是使用字符串?
理想情况下,我想执行以下操作:
db.First(&clientCustomerInvitation, ClientCustomerInvitation.CustomerId.gormAlias+" = ?", clientCustomer.Id)
我正在寻找一种使用gorm别名来映射字段的方法,该方法比单纯的字符串更优雅,更可重用。
答案 0 :(得分:1)
能够从某些结构字段获取标签值的唯一方法是使用<Link />
。
我的建议是,创建一个从特定结构字段返回标签值的函数。如下所示:
reflect
然后使用它来获取标签值。
func getGormAlias(obj interface{}, fieldName string) string {
if field, ok := reflect.TypeOf(obj).FieldByName(fieldName); ok {
return field.Tag.Get("gorm")
}
return ""
}
gormAliasCustomerId := getGormAlias(ClientCustomerInvitation{}, "CustomerId")
db.First(&clientCustomerInvitation, gormAliasCustomerId + " = ?", clientCustomer.Id)
函数的主要作用是
getGormAlias()
上的reflect.Type
来获得obj
的值。reflect.Type
从选定的字段名称中获取.FieldByName()
对象。reflect.Value
属性获得标签信息。使用它来获取.Tag
的标记值。