我最近在学习gorm,正接触到关联模式。其中,我对belongs to的示例定义如下:
```go
// Employee
// @Description 雇员
type Employee struct {
ID uint `gorm:"primary_key;autoIncrement:true"`
Name string
//[belongs to][一对一]声明写法如下
CID int //Company ID
C Company `gorm:"foreignKey:CID"`
// Company
// @Description: 公司
type Company struct {
ID uint `gorm:"primary_key;autoIncrement:true"`
Name string `gorm:"unique"`
}
```
在继续学习到查询时,我了解到了在Employees表中查Company信息需要使用:
```go
db.Model(&employee).Association("C").Find(&employee.C)
```
这样的写法,才能够查询到完整的Employee信息。现在我的问题是,如何查询工作于Name=“CompanyA”的公司的所有雇员信息?我能想到的是分两步:
```go
//1. 先根据公司名查公司id
db.First(&company, "name=?", "CompanyA")
//2. 再用得到的company.ID在用户表中查
db.Preload("C").Find(&results, "c_id=?", company.ID)
```
这样确实可行,但是我觉得会不会有更加简单的查询方式,一步就搞定的那种。官方文档看的很懵,网上搜索也没找到想要的东西,请问大家还知道别的写法吗?
我用了1楼的这个方式,观察执行的sql语句发现它不知为何用了left join,这样会把所有的Employee都查出来。如何更改为inner join呢?
#5
更多评论
```golang
db.Model(& Employee).Join("Company", "name=?","CompanyA").First(& results)
```
使用Join内关联就可以查找了
#1
还有一种做法,可以做双向一对一关联,就是把belongs to 和hasOne两种关联关系都用上
```golang
// Employee
// @Description 雇员
type Employee struct {
ID uint `gorm:"primary_key;autoIncrement:true"`
Name string
//[belongs to][一对一]声明写法如下
CID int //Company ID
C Company `gorm:"foreignKey:CID"`
// Company
// @Description: 公司
type Company struct {
ID uint `gorm:"primary_key;autoIncrement:true"`
Name string `gorm:"unique"`
Employee *Employee
}
```
这里需要注意的就是循环引入问题,所以需要再hasOne关系上使用指针类型,否则变异报错!
剩下的就和普通的预加载一样了
```golang
var company Company
db.Model(& Company).Preload("Employee").where("name=?","CompanyA").First(& company)
log.Println(company.Employee)
```
#2