如何正确调用gorm别名?

时间:2018-11-23 10:00:29

标签: go go-gorm

这是我的代码:

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别名来映射字段的方法,该方法比单纯的字符串更优雅,更可重用。

1 个答案:

答案 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的标记值。