У меня есть база данных postgres, и я использую Sequelize. Из таблиц транспортных средств и заказов я пытаюсь получить все доступные транспортные средства с учетом startDate и endDate.
Если я ищу Bookings с указанными датами, используя:
Bookings.findAll({
where: {
[Op.or]: [
{ dateOut : { [Op.gt]: req.body.startDate} },
{ dateIn : { [Op.lt]: req.body.startDate} }
],
[Op.or]: [
{ dateOut : { [Op.gt]: req.body.endDate} },
{ dateIn : { [Op.lt]: req.body.endDate} }
]
}
})
Я получаю все автомобили, которые забронированы на эти даты. Например, поиск с startDate 2020-12-12 и endDate 2020-12-13 дает мне следующие бронирования:
[
{
"id": 13,
"startDate": "2020-12-05T00:00:00.000Z",
"endDate": "2020-12-13T00:00:00.000Z",
"vehicleId": 1
},
{
"id": 12,
"startDate": "2020-12-12T00:00:00.000Z",
"endDate": "2020-12-13T00:00:00.000Z",
"vehicleId": 2
}
]
Можно ли использовать Sequelize для возврата транспортных средств из таблицы «Транспортные средства», которые не были найдены в этом первоначальном поиске?
ОБНОВЛЯТЬ
После ответа Анатолия у меня есть это. Он работает в ответ на результаты первого запроса:
.then(bookingData => {
const bookedVehicleIds = bookingData.map(x => x.vehicleId)
Vehicles.findAll({
where: {
id: {
[Op.notIn]: bookedVehicleIds
}
}
})
.then(results => {
res.send(results);
})
})
Я не вижу простого способа сделать один запрос вместо двух (используя только подзапрос NOT EXISTS
через sequelize.where
и sequelize.literal
).
Поэтому, если у вас уже есть Booking
экземпляры модели, вы можете просто использовать Op.notIn
, чтобы получить все Vehicles
, которые не были забронированы на данный период:
const bookings = await Bookings.findAll({
// ... where condition omitted
})
const bookedVehicleIds = bookings.map(x => x.vehicleId)
const notBookedVehicles = await Vehicles.findAll({
where: {
id: {
[Op.notIn]: bookedVehicleIds
}
}
})
x
просто имя параметра, представляющего один элемент массива. Вы можете дать ему любое имя, которое хотите
Спасибо, что нашли время. Я новичок в Sequelize и попытался подогнать ваш ответ под то, как я это делаю. Я обновил свой вопрос. Кажется, это работает, но я был бы признателен за объяснение того, где x входит в это.