我是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)
1条答案
按热度按时间rmbxnbpk1#
您可以通过为gorm实现定制的数据类型并在查询中使用它来从数据库接收
users
切片(见下文)。定制的数据类型必须实现Scanner和Valuer接口,因此GORM知道如何将其接收/保存到数据库。https://gorm.io/docs/data_types.html
因此您的
conversation
类型应该更新如下:为了能够查询对话中的所有参与用户,我们需要使用
jsonb_agg
和jsonb_build_object
构建json对象