go - 将两个 gorm 查询合二为一
问题描述
我有以下型号
type Instance struct {
gorm.Model
Name string `gorm:"index:idx_name_and_group,unique"`
UserID uint
GroupID uint `gorm:"index:idx_name_and_group,unique"`
...
}
type Group struct {
gorm.Model
Name string `gorm:"unique;"`
Instances []Instance
...
}
我正在尝试按名称和组名获取实例。
我可以使用以下代码来做到这一点
func (r instanceRepository) FindByName(groupName string, instanceName string) (*model.Instance, error) {
var instance *model.Instance
var group *model.Group
err := r.db.
First(&group, "name = ?", groupName).Error
if err != nil {
return nil, err
}
err = r.db.
Where("name = ? and group_id = ?", instanceName, group.ID).
First(&instance).Error
return instance, err
}
但我想把它变成一个查询。关于如何实现这一目标的任何想法?
解决方案
您始终可以使用Joins函数进行 SQL 连接。像这样的东西:
func (r instanceRepository) FindByName(groupName string, instanceName string) (*model.Instance, error) {
var instance *model.Instance
err := r.db.
Joins("INNER JOIN groups g ON g.id = instances.group_id").
Where("g.name = ? AND instances.name = ?", groupName, instanceName).
First(&instance).Error
if err != nil {
return nil, err
}
return instance, err
}
推荐阅读
- android - viewpager 2 中的当前可见片段
- javascript - 如何使用 ES6 递归删除第一个和最后一个元素?
- javascript - Polymer 3 中的条件渲染
- angular - Angular 中的 RxStomp 服务架构
- python - 在雅虎财经中刮取财务报告
- bitbucket - 限制拉取请求的数量 Bitbucket
- php - Laravel collection multi level groupBy insert new items without checking each level's key
- javascript - 如何更改html标签内容
- linux - Qt5/Yocto:捕获已部署应用程序的屏幕/屏幕录像
- android - 如何在 Android 的共享表上显示默认文件应用程序?