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

时间:2018-09-11 06:53:04

标签: 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

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排序。我该如何阻止它呢?

1 个答案:

答案 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