代码之家  ›  专栏  ›  技术社区  ›  Bussiere

如何正确调用gorm别名?

  •  1
  • Bussiere  · 技术社区  · 7 年前

    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)
    

    理想情况下,我想做如下事情:

     db.First(&clientCustomerInvitation, ClientCustomerInvitation.CustomerId.gormAlias+" = ?", clientCustomer.Id)
    

    1 回复  |  直到 6 年前
        1
  •  1
  •   novalagung Alexander Kim    7 年前

    从特定结构字段获取标记值的唯一方法是使用 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 为了得到 反射类型 价值。
    • 然后打电话 .FieldByName() reflect.Value 来自选定字段名的对象。
    • .Tag 财产。使用它来获取 gorm .