Gorm 左加入 Scan()
Gorm left join with Scan()
我正在尝试加入 classes.id = bookings.class_id
上的表 Class
和 Booking
并获得 DisplayBooking
类型的结果
type Class struct {
Id int `json:"id"`
Name string `json:"name"`
}
type Booking struct {
Id int `json:"id"`
User string `json:"user"`
Members int `json:"members"`
ClassId int `json:classid`
//Class Class `gorm:"constraint:OnUpdate:CASCADE,OnDelete:SET NULL;"`
}
type DisplayBooking struct {
Id int `json:"id"`
User string `json:"user"`
Members int `json:"members"`
ClassId int `json:classid`
ClassName string `json:"classname"`
}
为此,我尝试了 gorm 的 Scan()
和 Rows()
方法
func returnAllBookings(w http.ResponseWriter, r *http.Request) {
bookings := []DisplayBooking{}
db.Model(&Booking{}).Select("bookings.id, bookings.user, bookings.members, bookings.class_id, classes.name").Joins("left join classes on bookings.class_id = classes.id").Scan(&bookings)
fmt.Println("Endpoint Hit: returnAllBookings")
rows, err := db.Table("bookings").Select("bookings.id, bookings.user, bookings.members, bookings.class_id, classes.name").Joins("left join classes on bookings.class_id = classes.id").Rows()
if err != nil {
return
}
for rows.Next() {
log.Println(rows)
}
json.NewEncoder(w).Encode(bookings)
}
Scan()
return class_name 字段中的空值,虽然 Rows()
似乎可以完成工作,但输出格式不是 JSON 编码
Scan()
输出
[{"id":1,"user":"test1","members":1,"ClassId":2,"classname":""},{"id":2,"user":"test2","members":2,"ClassId":1,"classname":""}]
Rows()
输出(控制台)- 粗体值是正确的,但有很多不必要的信息
my-go-app_1 | 2021/04/09 07:42:09 &{0xc00021e1b0 0x6dcfa0 0xc00026adc0 <nil> <nil> {{0 0} 0 0 0 0} false <nil> **[1 test1 1 2 business]**}
my-go-app_1 | 2021/04/09 07:42:09 &{0xc00021e1b0 0x6dcfa0 0xc00026adc0 <nil> <nil> {{0 0} 0 0 0 0} false <nil> **[2 test2 2 1 first]**}
有没有办法让代码与 Scan()
函数一起工作?
你可以用Scan
,DisplayBooking
的class_name
字段没有值是因为字段的默认gorm tag name
是class_name
,但你要匹配的列是 name
,这两个不匹配。
您可以添加列别名来解决此问题,将您的 Scan()
表达式更改为以下:
db.Debug().Model(&Booking{}).Select("bookings.id, bookings.user, bookings.members, bookings.class_id, classes.name as class_name").Joins("left join classes on bookings.class_id = classes.id").Scan(&bookings)
我正在尝试加入 classes.id = bookings.class_id
上的表 Class
和 Booking
并获得 DisplayBooking
type Class struct {
Id int `json:"id"`
Name string `json:"name"`
}
type Booking struct {
Id int `json:"id"`
User string `json:"user"`
Members int `json:"members"`
ClassId int `json:classid`
//Class Class `gorm:"constraint:OnUpdate:CASCADE,OnDelete:SET NULL;"`
}
type DisplayBooking struct {
Id int `json:"id"`
User string `json:"user"`
Members int `json:"members"`
ClassId int `json:classid`
ClassName string `json:"classname"`
}
为此,我尝试了 gorm 的 Scan()
和 Rows()
方法
func returnAllBookings(w http.ResponseWriter, r *http.Request) {
bookings := []DisplayBooking{}
db.Model(&Booking{}).Select("bookings.id, bookings.user, bookings.members, bookings.class_id, classes.name").Joins("left join classes on bookings.class_id = classes.id").Scan(&bookings)
fmt.Println("Endpoint Hit: returnAllBookings")
rows, err := db.Table("bookings").Select("bookings.id, bookings.user, bookings.members, bookings.class_id, classes.name").Joins("left join classes on bookings.class_id = classes.id").Rows()
if err != nil {
return
}
for rows.Next() {
log.Println(rows)
}
json.NewEncoder(w).Encode(bookings)
}
Scan()
return class_name 字段中的空值,虽然 Rows()
似乎可以完成工作,但输出格式不是 JSON 编码
Scan()
输出
[{"id":1,"user":"test1","members":1,"ClassId":2,"classname":""},{"id":2,"user":"test2","members":2,"ClassId":1,"classname":""}]
Rows()
输出(控制台)- 粗体值是正确的,但有很多不必要的信息
my-go-app_1 | 2021/04/09 07:42:09 &{0xc00021e1b0 0x6dcfa0 0xc00026adc0 <nil> <nil> {{0 0} 0 0 0 0} false <nil> **[1 test1 1 2 business]**}
my-go-app_1 | 2021/04/09 07:42:09 &{0xc00021e1b0 0x6dcfa0 0xc00026adc0 <nil> <nil> {{0 0} 0 0 0 0} false <nil> **[2 test2 2 1 first]**}
有没有办法让代码与 Scan()
函数一起工作?
你可以用Scan
,DisplayBooking
的class_name
字段没有值是因为字段的默认gorm tag name
是class_name
,但你要匹配的列是 name
,这两个不匹配。
您可以添加列别名来解决此问题,将您的 Scan()
表达式更改为以下:
db.Debug().Model(&Booking{}).Select("bookings.id, bookings.user, bookings.members, bookings.class_id, classes.name as class_name").Joins("left join classes on bookings.class_id = classes.id").Scan(&bookings)