Gorm和多对多关系

  • 本文关键字:关系 Gorm go go-gorm
  • 更新时间 :
  • 英文 :


我有一个问题,了解如何使用gorm获取相关信息。这是我第一次积极地使用ORM。

我正在尝试获取特定用户id可以访问的所有设备。使用当前函数,我获得了所有设备,不仅是属于实际用户id的设备,而且还包括该设备所属的用户列表,这是我目前确实不需要的信息。

是否有办法获得的设备,用户有权使用使用gorm使用user_devices连接表,或者这是我应该创建一个自定义查询,以实现我想要的?

谢谢。

type User struct {
ID          uint
Name        string
Email       string
Age         uint8
Birthday    time.Time
Password    string
ActivatedAt time.Time
OrgID       uint
Org         Org
Devices     []Device `gorm:"many2many:user_devices"`
CreatedAt   time.Time
UpdatedAt   time.Time
}
type Device struct {
ID           uint
Name         string
Hwaddr       string
OrgID        uint
PublicIP     uint
Org          Org
Users        []User `gorm:"many2many:user_devices"`
DeviceType   string
Identity     string
LastPolledAt time.Time
CreatedAt    time.Time
UpdatedAt    time.Time
}
func (u *Device) FindAllDevicesByUid(db *gorm.DB, user *User) (*[]Device, error) {
var err error
devices := []Device{}
err = db.Debug().Preload("Users", "user_id = ?", user.ID).Find(&devices).Error
if err != nil {
return &[]Device{}, err
}
return &devices, err
}
结果:

{
"ID": 4,
"Name": "Test 4",
"Hwaddr": "00:00:00:00:00:04",
"OrgID": 1,
"PublicIP": 0,
"Org": {
"Id": 0,
"Name": "",
"Users": null,
"CreatedAt": "0001-01-01T00:00:00Z",
"UpdatedAt": "0001-01-01T00:00:00Z"
},
"Users": [
{
"ID": 1,
"Name": "Jan Astrup",
"Email": "some@email.com",
"Age": 0,
"Birthday": "0001-01-01T00:00:00Z",
"ActivatedAt": "2022-04-24T15:48:40+02:00",
"OrgID": 1,
"Org": {
"Id": 0,
"Name": "",
"Users": null,
"CreatedAt": "0001-01-01T00:00:00Z",
"UpdatedAt": "0001-01-01T00:00:00Z"
},
"Devices": null,
"CreatedAt": "2022-04-24T15:48:40+02:00",
"UpdatedAt": "2022-04-24T15:48:40+02:00"
}
],
"DeviceType": "Router",
"Identity": "M1923 4",
"LastPolledAt": "0001-01-01T00:00:00Z",
"CreatedAt": "2022-04-24T15:17:30+02:00",
"UpdatedAt": "2022-04-24T15:17:30+02:00"
}

要加载特定用户的设备,可以使用Joins函数连接表user_devicesdevices

devices := []Device{}
err = db.Debug().Joins("JOIN user_devices ud ON ud.device_id = devices.id").Where("ud.user_id = ?", user.ID).Find(&devices).Error

除此之外,您还可以加载用户并预加载其设备:

u := User{}
err = db.Debug().Preload("Devices").First(&u, user.ID).Error

然后,您可以使用u.Devices返回用户的设备,但是我认为这种方法执行两个查询来获得用户的设备。

相关内容

  • 没有找到相关文章

最新更新