【问题标题】:Golang Gorm Many to Many with Selective ColumnGolang Gorm 多对多与选择性列
【发布时间】:2022-01-17 16:47:53
【问题描述】:

我正在尝试获取具有许多作者的图书数据。它们之间的关系类型是简单的多对多,数据透视表只包含两个 ID。这是模型,

package model

import "gorm.io/gorm"

type Author struct {
    gorm.Model
    ID   uint    `gorm:"primaryKey; autoIncrement" json:"id"`
    Name string  `gorm:"Not Null" json:"name"`
    Book []*Book `gorm:"many2many:trx_book_author;" json:"books"`
}

func (author *Author) TableName() string {
    return "tbl_authors"
}
package model

import "gorm.io/gorm"

type Book struct {
    gorm.Model
    ID          uint      `gorm:"primaryKey; autoIncrement" json:"id"`
    Title       string    `gorm:"Not Null" json:"title"`
    Description string    `json:"description"`
    PageNumber  int       `gorm:"Not Null" json:"page_number"`
    Author      []*Author `gorm:"many2many:trx_book_author;" json:"authors"`
}

func (book *Book) TableName() string {
    return "tbl_books"
}

这就是我获取数据的方式,

func (bookRepository *BookRepository) GetAll() []model.Book {
    var books []model.Book

    bookRepository.db.Preload("Author").Find(&books)

    return books
}

每当我点击 URL 时,我都会得到一堆我想要的数据,但我想在作者上选择 only 'name' 列。 我已经尝试过这个解决方案,但它不起作用

func (bookRepository *BookRepository) GetAll() []model.Book {
    var books []model.Book

    bookRepository.db.Preload("Author", func(tx *gorm.DB) *gorm.DB {
        return tx.Select("name")
    }).Find(&books)

    return books
}

有什么想法吗?

编辑 1: 这是使用 tx.Select("name") 或 ("Name") 时产生的错误

failed to assign association &model.Author{Model:gorm.Model{ID:0x0, CreatedAt:time.Date(1, time.January, 1, 0, 0, 0, 0, time.UTC), UpdatedAt:time.Date(1, time.January, 1, 0, 0, 0, 0, time.UTC), DeletedAt:gorm.DeletedAt{Time:time.Date(1, time.January, 1, 0, 0, 0, 0, time.UTC), Valid:false}}, ID:0x0, Name:"dowjqdiq", Book:[]*model.Book(nil)}, make sure foreign fields exists; failed to assign association &model.Author{Model:gorm.Model{ID:0x0, CreatedAt:time.Date(1, time.January, 1, 0, 0, 0, 0, time.UTC), UpdatedAt:time.Date(1, time.January, 1, 0, 0, 0, 0, time.UTC), DeletedAt:gorm.DeletedAt{Time:time.Date(1, time.January, 1, 0, 0, 0, 0, time.UTC), Valid:false}}, ID:0x0, Name:"ddqw", Book:[]*model.Book(nil)}, make sure foreign fields exists; failed to assign association &model.Author{Model:gorm.Model{ID:0x0, CreatedAt:time.Date(1, time.January, 1, 0, 0, 0, 0, time.UTC), UpdatedAt:time.Date(1, time.January, 1, 0, 0, 0, 0, time.UTC), DeletedAt:gorm.DeletedAt{Time:time.Date(1, time.January, 1, 0, 0, 0, 0, time.UTC), Valid:false}}, ID:0x0, Name:"vevebe", Book:[]*model.Book(nil)}, make sure foreign fields exists
[24.020ms] [rows:5] SELECT * FROM `tbl_books` WHERE `tbl_books`.`deleted_at` IS NULL

【问题讨论】:

  • 试试tx.Select("Name")
  • @EminLaletovic 不起作用,错误与使用“名称”相同,我将添加错误
  • 创建新的结构来保存它,因为只要你使用带有预加载的 model.Book,你仍然会得到空值的信息。

标签: go grails-orm


【解决方案1】:

可以在 Preload 中使用 Custom Preloading SQL 选择特定字段。

使用要从数据库中获取的特定字段创建自定义结构。

type TempBook struct{
  Field_Name Data_Type
  .
  .
  .

}

db.Model(&Book{}).Preload("Author", func(tx *gorm.DB) *gorm.DB {
return tx.Select("Name")
}).Find(&TempBook{})

如果你想摆脱错误:

在这种情况下,对于“has_many”关联,您应该同时指定外键和关联外键。

最初添加外键。如果它仍然不起作用,请添加 AssociationForeignKey。

确保您应该在自定义结构中指定 ForeignKey,如下所示: gorm:"foreignKey:ID"

为了更好地理解,请参阅此链接:https://github.com/go-gorm/gorm/issues/4015Golang gorm preloading

Pluck() 也可以查询单列,但要确定 Preload 是否支持。

Pluck 你可以参考这个链接:https://gorm.io/docs/advanced_query.html#Pluck

【讨论】:

    猜你喜欢
    • 2016-06-19
    • 2017-06-06
    • 2016-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-16
    • 2012-11-08
    相关资源
    最近更新 更多