GORM 中使用非主键连接表

hac*_*2.0 5 go go-gorm

BookData我正在尝试根据非主键的字段检索作者的信息。您可以在下面看到我的表AuthorId中的BookData内容,我试图根据该信息获取作者AuthorId,即使它不是主键。GORM 似乎不支持这种类型的连接,有办法做到这一点吗?

您还可以在下面看到我能够正确获取信息,PublisherProperty因为它的外键是BookData的主键。我只是想知道如果它不是主键该怎么做。提前致谢!

type BookData struct {
    Id                string              `gorm:"primary_key;column:book_id"`
    AuthorId          string              `gorm:"column:author_id"`
    Author            AuthorData          `gorm:"foreignkey:AuthorId"`
    PublisherProperty []PublisherProperty `gorm:"foreignkey:Id"`
}

type AuthorData struct {
    Id    string `gorm:"primary_key;column:author_id"`
    Name  string `gorm:"column:author_name"`
}


type PublisherProperty struct {
    Id           string `gorm:"primary_key;column:book_id"`
    PublisherId  string `gorm:"primary_key;column:publisher_id"`
    PublisherTxt string `gorm:"column:publisher_txt"`
}

Run Code Online (Sandbox Code Playgroud)

小智 0

ForeignKey您可以使用and关键字References。更多用例可以参考GORM官方文档

import (
    "fmt"
    "gorm.io/driver/mysql"
    "gorm.io/gorm"
    "gorm.io/gorm/logger"
)

type BookData struct {
    Id                string              `gorm:"primary_key;column:book_id"`
    AuthorId          string              `gorm:"column:author_id"`
    Author            AuthorData          `gorm:"ForeignKey:Id;References:AuthorId"`
    PublisherProperty []PublisherProperty `gorm:"ForeignKey:Id"`
}

type AuthorData struct {
    Id   string `gorm:"primary_key;column:author_id"`
    Name string `gorm:"column:author_name"`
}

type PublisherProperty struct {
    Id           string `gorm:"primary_key;column:book_id"`
    PublisherId  string `gorm:"primary_key;column:publisher_id"`
    PublisherTxt string `gorm:"column:publisher_txt"`
}

var db *gorm.DB

func init() {
    dsn := "user:pass@tcp(127.0.0.1:3306)/temp?charset=utf8mb4&parseTime=True&loc=Local"
    var err error
    db, err = gorm.Open(mysql.Open(dsn), &gorm.Config{
        Logger: logger.Default.LogMode(logger.Info),
    })
    if err != nil {
        panic(err)
    }
}

func main() {
    var books []BookData
    err := db.Preload("Author").Preload("PublisherProperty").
        Find(&books).Limit(10).Error
    if err != nil {
        fmt.Println(err)
        return
    }
    fmt.Println(books)
    // output:
    // [{1 1 {1 author1} [{1 1 } {1 2 }]} {2 1 {1 author1} []}]
}
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述