在我的数据库中,有一个用户表,该表通过多对多表连接到学校。学校有很多工作。我正在尝试将所有学校及其工作归还给特定用户。到目前为止,这是我的代码:
var user User
err := db.Where("id = ?", userID).Preload("Schools")
.Preload("Schools.Jobs", func(db *gorm.DB) *gorm.DB {
return db.Order("job.job_reference DESC")
}).First(&user).Error
return &user.Schools, err
Gorm然后执行以下查询:
SELECT * FROM `user` WHERE (id = 'foo') ORDER BY `user`.`id` ASC LIMIT 1
SELECT * FROM `school`
INNER JOIN `user_school` ON `user_school`.`school_id` = `school`.`id`
WHERE (`user_school`.`user_id` IN ('foo'))
SELECT * FROM `job` WHERE (`school_id` IN ('1','2'))
ORDER BY job.job_reference DESC,`job`.`id` ASC
前两个生成的SQL查询完全符合我的预期,但是最后一个查询尝试按我提供的条件和ID进行默认排序。如果删除特定的排序说明,它仍会尝试按ID排序。我该如何阻止它呢?
答案 0 :(得分:1)
我遇到了同样的问题。当您使用 .First()
时,它需要按某种顺序进行排序。只需在您的示例中更改为使用 Scan
:
err := db.Where("id = ?", userID).Preload("Schools")
.Preload("Schools.Jobs", func(db *gorm.DB) *gorm.DB {
return db.Order("job.job_reference DESC")
}).Scan(&user).Error
return &user.Schools, err
source: https://github.com/go-gorm/gorm/blob/master/finisher_api.go#L113