使用条件查询多对多
Querying Many to Many with Conditions
我有一个像这样的 gorm many2many 模型:
type User struct {
gorm.Model
Username string
LikedBooks []Books `gorm:"many2many:user_liked_books;"`
}
type Book struct {
gorm.Model
Name string
Likes []User `gorm:"many2many:user_liked_books;"`
}
一个 User
可以喜欢很多 Book
,而一个 Book
可以有很多 User
喜欢它。
我现在想查询被点赞的图书,return 前50个被点赞的图书。
我怎样才能使用 gorm 实现它?我不明白如何查询 book.liked = true 的条件,按喜欢的计数排序,限制为 50.
我无法在文档或 Whosebug 上找到这样的示例。
这可以通过为您描述的请求构建 SQL 查询的相同方式来完成,只需使用 gorm 函数即可。它可能看起来像这样:
var books []Book
tx := db.Table("books").
Joins("INNER JOIN user_liked_books ulb ON ulb.book_id = books.id").
Select("books.id, books.name, count(ulb.user_id) as likes_count").
Group("books.id, books.name").
Order("likes_count desc").
Limit(50).
Find(&books)
如果您还想加载 Likes
字段,请尝试将 .Preload("Likes")
添加到上面的构造中。
我有一个像这样的 gorm many2many 模型:
type User struct {
gorm.Model
Username string
LikedBooks []Books `gorm:"many2many:user_liked_books;"`
}
type Book struct {
gorm.Model
Name string
Likes []User `gorm:"many2many:user_liked_books;"`
}
一个 User
可以喜欢很多 Book
,而一个 Book
可以有很多 User
喜欢它。
我现在想查询被点赞的图书,return 前50个被点赞的图书。
我怎样才能使用 gorm 实现它?我不明白如何查询 book.liked = true 的条件,按喜欢的计数排序,限制为 50.
我无法在文档或 Whosebug 上找到这样的示例。
这可以通过为您描述的请求构建 SQL 查询的相同方式来完成,只需使用 gorm 函数即可。它可能看起来像这样:
var books []Book
tx := db.Table("books").
Joins("INNER JOIN user_liked_books ulb ON ulb.book_id = books.id").
Select("books.id, books.name, count(ulb.user_id) as likes_count").
Group("books.id, books.name").
Order("likes_count desc").
Limit(50).
Find(&books)
如果您还想加载 Likes
字段,请尝试将 .Preload("Likes")
添加到上面的构造中。