我有兩個資料庫 Booking 和 Room。Booking已將roomid作為其領域之一。我寫了一個選擇陳述句,它將檢索到的行保存在結果變數中,如下所述。
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()
for rows.Next() {
utils.DB.ScanRows(rows, &result)
fmt.Println(result.RoomID)
}
現在我的 result.roomid 的 roomid 值滿足 bookings 表中的 select 陳述句
我的結果變數可能有多個房間 ID 值。我可以通過回圈結果變數來檢索 roomid 值。現在我必須檢查我的名為 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 handlers
import (
"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
}
noOfRoomsOccupied := 0
var notinrooms string
// Use GORM API build SQL
//check if any rooms are available which havent been booked yet in the requested check-in and check-out dates
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)
fmt.Println(result.RoomID)
notinrooms = notinrooms result.RoomID ","
}
notinrooms = strings.TrimRight(notinrooms, ",")
fmt.Println(notinrooms)
//calculate the number of rooms in the database
//rows, err := utils.DB.Model(&models.Room{}).Select("room_id").Rows()
res := utils.DB.Find(&models.Room{})
rowcount := res.RowsAffected
fmt.Println(rowcount)
if noOfRoomsOccupied == int(rowcount) {
var resp = map[string]interface{}{"status": false, "message": "no rooms available in the specified time period"}
json.NewEncoder(w).Encode(resp)
return
} else {
noOfRooms := (currRequest.NoOfGuests currRequest.NoOfChildren) / 2
if (currRequest.NoOfGuests currRequest.NoOfChildren)%2 == 1 {
noOfRooms = noOfRooms 1
}
if int(noOfRooms) < int(rowcount)-noOfRoomsOccupied {
fmt.Println("number of rooms to book : ", noOfRooms)
//assign rooms if available
var roomids models.Room
//rows, err := utils.DB.Model(&models.Room{}).Not(result.RoomID).Select("room_id").Rows()
fmt.Println("rooms that can be booked")
rows, err := utils.DB.Model(&models.Room{}).Not(result.RoomID).Select("room_id").Rows()
//rows, err := utils.DB.Model(&models.Room{}).Not([]string{notinrooms}).Select("room_id").Rows()
//map[string]interface{}{"name": []string{"jinzhu", "jinzhu 2"}}
if err != nil {
json.NewEncoder(w).Encode(err)
fmt.Print("error occured in select statement to get room ids to assign")
return
} else {
defer rows.Close()
for rows.Next() {
noOfRoomsOccupied = noOfRoomsOccupied 1
utils.DB.ScanRows(rows, &roomids)
fmt.Println(roomids.RoomID)
}
}
var success = map[string]interface{}{"message": "Select statement worked well"}
json.NewEncoder(w).Encode(success)
return
}
}
}
}
當我執行 result.roomid 時,它只給出第一個房間 ID,并在上面的 select 陳述句中只洗掉那個房間 ID。如何消除我在房間表資料中的預訂表中找到的所有房間 ID?
我嘗試拆分 result.roomid 值并嘗試形成一個字串并在 select 陳述句中給出它,但這不起作用。我嘗試遍歷每個 result.roomid 并在陳述句中運行 not ,但這沒有任何意義。
uj5u.com熱心網友回復:
使用此代碼:
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
}
}
但是,由于您只需要無論如何,您可以通過使用(假設是 type )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()
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/450167.html
上一篇:Go1.18中的go.work.sum檔案跟蹤什么?
下一篇:3D等距投影的著色
