我想阅读按作者研究生院名称过滤的书籍,并获取这些书籍的所有详细信息。 我的结构为
Book
、Author
、Publisher
和 School
。相同的关系在结构本身中定义
type Book struct {
bun.BaseModel `bun:"table:book"`
AuthorID uint32 `bun:"author_id"`
PublisherID uint32 `bun:"publisher_id"`
Author *Author `bun:"rel:belongs-to,join:author_id=id"`
Publisher *Publisher `bun:"rel:belongs-to,join:publisher_id=id"`
}
type Author struct {
bun.BaseModel `bun:"table:author"`
ID uint32 `bun:"id,pk"`
Name string `bun:"name"`
HighSchoolID uint32 `bun:"grad_school_id"`
HighSchoo *School `bun:"rel:belongs-to,join:grad_school_id=id"`
GradSchoolID uint32 `bun:"grad_school_id"`
GradSchool *School `bun:"rel:belongs-to,join:grad_school_id=id"`
}
type Publisher struct {
bun.BaseModel `bun:"table:publisher"`
ID uint32 `bun:"id,pk"`
Name string `bun:"name"`
}
type School struct {
bun.BaseModel `bun:"table:school"`
ID uint32 `bun:"id,pk"`
Name string `bun:"name"`
}
我尝试过以下查询,但这在嵌套 where 子句上失败
repo.db.
Reader().
NewSelect().
Model(&Book{}).
Relation("Author").
Relation("Publisher").
Relation("Author.HighSchool").
Relation("Author.GradSchool").
Where("grad_school.name = ?", "grad_school_name").
Scan(ctx)
您应该启用 debug 模式,将 Bun 查询打印到标准输出,并查看为嵌套关系分配了哪些别名。 我认为面包在关系之间添加了双下划线,所以在你的情况下它可能是:
Relation("Author.GradSchool"). // this becomes author__grad_school in sql
Where("author__grad_school.name = ?", "grad_school_name").
但是查询调试会显示正确的名称。