您好我遇到了一个问题,即找到最佳解决方案来查找和计算当前可用于预订的所有车辆。我的意思是Car模型和Reservation模型之间存在这样的关系:
Reservation.belongsTo(Car);
Car.hasMany(Reservation, {foreignKey: { allowNull: false }});
然后我需要找到用户在他/她选择的时间段内可以预订的所有车辆。例如,让我们想象一下这种情况: 我们有3辆车A,B,C和:
汽车A:现在有两个预订 - 从2016年10月10日到2016年10月13日以及2016年10月17日 - 2016年10月18日车B:有一个预订 - - 8.10.2016 - 11.10.2016
C车:一次预订 - 2016年10月15日 - 2016年10月16日
用户希望从2016年12月12日至2016年10月16日预订车辆。
因此,他只能选择一辆车:CAR B
我已经创建了这样的查询来获得这个结果:
var results = await Car.findAndCountAll({
include: [{
model: Reservation,
where: {
$not: {
$or: [
{
dateIn: {
$between: [chosenIn, chosenOut],
}
},
{
dateOut: {
$between: [chosenIn, chosenOut],
}
}
]
}
},
required: true
}],
});
但是当每辆车只有一次预订时,每一件事情都会很好。如果我已经显示结果将是从2016年10月17日至2016年10月18日可预订的Car Car B和Car A.我不知道为什么一辆有多个预订的汽车被视为“单独的车身”。不像一辆车。很明显,此查询选择所有车辆至少填满一个属于他们的预订。只有在所有预订都已满足时才应列出它们。但不幸的是,我无法通过这个ORM克服这个问题,我也无法在Sequelize文档中获得必要的信息。谢谢你的帮助。
答案 0 :(得分:1)
尝试使用.findAll()
查询,然后通过cars.length
获取汽车数量。结果将包含一系列预订的独特汽车。
再添加一个表达式,以避免出现这样的情况: 如果您选择09.10.2016-10.10.2016日期,您的查询将返回carB即使它在此时有预订
where:{
$not: {
$or: [
{
dateIn: {
$between: [chosenIn, chosenOut],
}
},
{
dateOut: {
$between: [chosenIn, chosenOut],
}
},
$and: [
{
dateIn: {
$lt: chosenIn,
}
},
{
dateOut: {
$gt: chosenIn,
}
},
]
]
}
}
答案 1 :(得分:0)
设置日志记录,其中应包含生成的SQL,以便您深入了解此问题:
var sequelize = new Sequelize('database', 'username', 'password', {
logging: console.log
logging: function (str) {
// do your own logging
}
});