Как правильно назвать псевдоним gorm? - PullRequest
0 голосов
/ 23 ноября 2018

Вот мой код:

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 голосов
/ 23 ноября 2018

Единственный способ получить значение тега из определенного структурного поля - использовать 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 собственность.Используйте это, чтобы получить значение тега gorm.
...