【问题标题】:How to call gorm alias properly?如何正确调用gorm别名?
【发布时间】:2019-04-25 22:23:41
【问题描述】:

这是我的代码:

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

【问题讨论】:

    标签: go go-gorm


    【解决方案1】:

    能够从特定结构字段获取标签值的唯一方法是使用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() 函数的基本作用:

    • 使用obj 上的reflect.Type 获取reflect.Type 值。
    • 然后调用.FieldByName()从选中的字段名中获取reflect.Value对象。
    • 标签信息可通过.Tag 属性获得。使用它来获取gorm的标签值。

    【讨论】:

      猜你喜欢
      • 2013-10-28
      • 2016-08-17
      • 1970-01-01
      • 1970-01-01
      • 2022-01-12
      • 1970-01-01
      • 1970-01-01
      • 2011-07-01
      • 1970-01-01
      相关资源
      最近更新 更多