【发布时间】:2021-03-25 09:06:22
【问题描述】:
我是 gorm 和 golang 的新手,我正在处理一个查询,以获取用户与对话中用户的对话。我的查询按预期工作,但我的问题是它没有带来用户的关系。
这是我的对话模型:
type Conversation struct {
ID uint `gorm:"primarykey"`
Users []User `gorm:"many2many:user_has_conversations;"`
Messages []ConversationMessage
}
这是我对数据库的要求:
var conversations []model.Conversation
result := r.db.Debug().Scopes(
pagination.Paginate,
scope.OrderByIDDescTable(conversationsTable),
).Joins(
"INNER JOIN `user_has_conversations` ON `user_has_conversations`.`conversation_id` = `conversations`.`id`",
).Joins(
"INNER JOIN `users` ON `users`.`id` = `user_has_conversations`.`user_id` AND `users`.`id` = ?",
UserID,
).Find(&conversations)
此查询工作正常,并且正确地带来了用户的对话,但没有将关系中的用户归还给我,并且当您查看它运行的查询时,它不会带来用户字段。
执行的查询:
SELECT `conversations`.`id`
FROM `conversations`
INNER JOIN `user_has_conversations` ON `user_has_conversations`.`conversation_id` = `conversations`.`id`
INNER JOIN `users` ON `users`.`id` = `user_has_conversations`.`user_id` AND `users`.`id` = 1
ORDER BY `conversations`.`id` desc LIMIT 10;
在查询中可以看到查询是正确的,但是没有Select与关系的字段。
如果我在内部连接中也使用预加载确实给了我正确的解决方案,但我认为当我已经加入来对用户进行预加载以再次获得用户时,这对性能没有好处。我希望能够通过加入获得它,而不是使用预加载。
这个例子有效,但如果有办法,我想在没有预加载的情况下使用它。
result := r.db.Debug().Scopes(
pagination.Paginate,
scope.OrderByIDDescTable(conversationsTable),
).Preload("Users").Joins(
"INNER JOIN `user_has_conversations` ON `user_has_conversations`.`conversation_id` = `conversations`.`id`",
).Joins(
"INNER JOIN `users` ON `users`.`id` = `user_has_conversations`.`user_id` AND `users`.`id` = ?",
UserID,
).Find(&conversations)
【问题讨论】: