如何阻止 GORM 按 ID 对我的预载进行排序?

Las*_*sus 9 mysql go go-gorm

在我的数据库中,我有一个用户表,通过多对多表连接到学校。一个学校有很多工作岗位。我正在尝试为特定用户返回所有学校及其工作。到目前为止,这是我的代码:

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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

前两个生成的 SQL 查询完全符合我的预期,但是最后一个查询尝试按我提供的条件进行排序,并按 ID 进行默认排序。如果我删除特定的排序指令,它仍会尝试按 ID 排序。我怎样才能阻止它这样做?

Raf*_*ich 8

我有同样的问题。当你使用.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
Run Code Online (Sandbox Code Playgroud)