亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

不符合在 golang 中使用 gorm 的條件

不符合在 golang 中使用 gorm 的條件

Go
哆啦的時光機 2022-11-23 20:01:14
我有兩個數據庫 Booking 和 Room。Booking 將 roomid 作為其字段之一。我寫了一個 select 語句,它將檢索到的行保存在結果變量中,如下所述。var result models.Bookingrows, err := utils.DB.Model(&currRequest).Where("check_in BETWEEN ? AND ? AND check_out BETWEEN ? AND ?", currRequest.CheckIn, currRequest.CheckOut, currRequest.CheckIn, currRequest.CheckOut).Select("room_id").Rows()for rows.Next() {            utils.DB.ScanRows(rows, &result)            fmt.Println(result.RoomID)        }現在我的 result.roomid 具有滿足 bookings 表中的 select 語句的 roomids 值我的結果變量可能有多個房間 ID 值。我能夠通過遍歷結果變量來檢索 roomid 值?,F在我必須檢查名為 Room 的主房間數據庫,并獲取那些不在結果結構中的房間 ID。通過使用以下語句,我只能訪問 result.roomid 中的第一個值,因此 not in 條件僅考慮 result.roomid 中的第一個值。我如何對 result.roomid 中的所有值執行不符合條件?rows, err := utils.DB.Model(&models.Room{}).Not(result.RoomID).Select("room_id").Rows()完整代碼:package handlersimport (    "encoding/json"    "fmt"    "net/http"    "server/models"    "server/utils"    "strings")func AvailableRoomsHandler(w http.ResponseWriter, r *http.Request) {    currRequest := &models.Booking{}    err := json.NewDecoder(r.Body).Decode(currRequest)    //check if a valid request has been sent from front end    if err != nil {        //fmt.Println(err)        var resp = map[string]interface{}{"status": false, "message": "Invalid json request"}        json.NewEncoder(w).Encode(resp)        return    }當我執行 result.roomid 時,它只給出第一個房間 ID,并在上面的 select 語句中只刪除那個房間 ID。如何消除我在房間表數據中的預訂表中找到的所有房間 ID?我嘗試拆分 result.roomid 值并嘗試形成一個字符串并在 select 語句中給出它,但這沒有用。我嘗試遍歷每個 result.roomid 并在語句中運行 not 但這沒有任何意義。
查看完整描述

1 回答

?
慕斯王

TA貢獻1864條經驗 獲得超2個贊

使用此代碼:


var result models.Booking

rows, err := utils.DB.Model(&currRequest).Where("check_in BETWEEN ? AND ? AND check_out BETWEEN ? AND ?", currRequest.CheckIn, currRequest.CheckOut, currRequest.CheckIn, currRequest.CheckOut).Select("room_id").Rows()

if err != nil {

        json.NewEncoder(w).Encode(err)

        fmt.Print("error occured in select statement")

        return

} else {

        defer rows.Close()

        for rows.Next() {

            noOfRoomsOccupied = noOfRoomsOccupied + 1

            utils.DB.ScanRows(rows, &result)

            //rest of the code

        }

}

您只能從結果集中獲得一行,其中可能有很多行。要獲取所有行并提取它們的值,您應該使用[]models.Booking.


result := []models.Booking{}

rows, err := utils.DB.Model(&currRequest).Where("check_in BETWEEN ? AND ? AND check_out BETWEEN ? AND ?", currRequest.CheckIn, currRequest.CheckOut, currRequest.CheckIn, currRequest.CheckOut).Select("room_id").Rows()

if err != nil {

        json.NewEncoder(w).Encode(err)

        fmt.Print("error occured in select statement")

        return

} else {

        defer rows.Close()

        for rows.Next() {

            var b models.Booking

            noOfRoomsOccupied = noOfRoomsOccupied + 1

            utils.DB.ScanRows(rows, &b)

            result = append(result, b)

            //rest of the code

        }

}

但是,由于無論如何你只需要,你可以通過使用(假設is 類型)roomid使它更容易。[]uintroomiduint


result := []uint{}

rows, err := utils.DB.Model(&currRequest).Where("check_in BETWEEN ? AND ? AND check_out BETWEEN ? AND ?", currRequest.CheckIn, currRequest.CheckOut, currRequest.CheckIn, currRequest.CheckOut).Select("room_id").Rows()

if err != nil {

        json.NewEncoder(w).Encode(err)

        fmt.Print("error occured in select statement")

        return

} else {

        defer rows.Close()

        for rows.Next() {

            var rid uint

            noOfRoomsOccupied = noOfRoomsOccupied + 1

            utils.DB.ScanRows(rows, &rid)

            result = append(result, rid)

            //rest of the code

        }

}

隨著resulttype 的存在[]uint,將它與Not函數一起使用會更容易(根據文檔):


rows, err := utils.DB.Model(&models.Room{}).Not(result).Select("room_id").Rows()


查看完整回答
反對 回復 2022-11-23
  • 1 回答
  • 0 關注
  • 185 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號