首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >戈朗戈姆,许多人都有选择性专栏

戈朗戈姆,许多人都有选择性专栏
EN

Stack Overflow用户
提问于 2022-01-07 17:13:01
回答 2查看 1.2K关注 0票数 0

我正在尝试获取有许多作者的书籍数据。它们之间的关系类型很简单-从多到多-只有一个枢轴表包含两个ID。

代码语言:javascript
复制
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"
}
代码语言:javascript
复制
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"
}

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

代码语言:javascript
复制
func (bookRepository *BookRepository) GetAll() []model.Book {
    var books []model.Book

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

    return books
}

每当我点击URL时,我都会得到一些我想要的数据,但我想选择作者上的 'name‘列。

我试过这个解决方案,但不起作用

代码语言:javascript
复制
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(“名称”)或(“名称”)时产生的错误

代码语言:javascript
复制
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
EN

回答 2

Stack Overflow用户

发布于 2022-01-17 08:47:53

使用Custom Preloading SQL在预加载中选择一个特定字段是可能的。

使用要从DB获取的特定字段创建一个自定义结构。

代码语言:javascript
复制
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“关联,您应该同时指定外键和关联外键。

不适当地添加ForeignKey。如果它仍然不能工作,那么添加AssociationForeignKey。

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

要更好地理解,请参考以下链接:https://github.com/go-gorm/gorm/issues/4015Golang gorm preloading

Pluck()也可以查询单个列,但可以确定预加载是否支持它。

对于Pluck,您可以参考以下链接:https://gorm.io/docs/advanced_query.html#Pluck

票数 0
EN

Stack Overflow用户

发布于 2022-08-29 17:45:56

问题在于你想要建立的关系。GORM中的HasMany将在一对多的关系中预加载实体。

您正在寻找许多到多个和一个自定义预加载来从第三个表中获取作者的名称。

我有过这个问题,我就是这样解决的:

代码语言:javascript
复制
    query.
    Preload("Ingredients", func(db *gorm.DB) *gorm.DB {
        return db.Joins("LEFT JOIN ingredients ON ingredients.id=meal_ingredients.ingredient_id").Select("name, macronutrient, measure, amount, meal_id")
    }).
    Find(&model)

这意味着预装连接表,并从另一个表中获取作者姓名信息,以便在基本模型中预加载它,将预加载视为HasMany,并为您解决问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70624845

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档