我正在尝试获取有许多作者的书籍数据。它们之间的关系类型很简单-从多到多-只有一个枢轴表包含两个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时,我都会得到一些我想要的数据,但我想选择作者上的仅 '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(“名称”)或(“名称”)时产生的错误
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
发布于 2022-01-17 08:47:53
使用Custom Preloading SQL
在预加载中选择一个特定字段是可能的。
使用要从DB获取的特定字段创建一个自定义结构。
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/4015和Golang gorm preloading
Pluck()
也可以查询单个列,但可以确定预加载是否支持它。
对于Pluck,您可以参考以下链接:https://gorm.io/docs/advanced_query.html#Pluck
发布于 2022-08-29 17:45:56
问题在于你想要建立的关系。GORM中的HasMany将在一对多的关系中预加载实体。
您正在寻找许多到多个和一个自定义预加载来从第三个表中获取作者的名称。
我有过这个问题,我就是这样解决的:
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,并为您解决问题。
https://stackoverflow.com/questions/70624845
复制相似问题