【问题标题】:Gorm left join with Scan()Gorm 使用 Scan() 左连接
【发布时间】:2021-07-05 02:16:13
【问题描述】:

我正在尝试在classes.id = bookings.class_id 上加入表ClassBooking 并获得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() 在 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() 函数一起工作?

【问题讨论】:

  • 扫描有什么用?它有什么作用或有什么好处?

标签: go join left-join go-gorm


【解决方案1】:

你可以用Scan来做,DisplayBookingclass_name字段没有值是因为该字段的默认gorm tag nameclass_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)

【讨论】:

  • 我们如何获取行的元素?喜欢rows.User?或行[“用户”]?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-08
  • 2010-11-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多