您好,我遇到了一个问题,找到最好的解决方案,以查找和计数所有的汽车,目前可供预订。我的意思是在汽车模型和预订模型之间有这样的关系:
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
car C: one预订- 15.10.2016 - 16.10.2016
用户希望预订2016年10月12日至2016年10月16日的用车。
因此,他应该只收到一辆汽车可供选择:汽车B
我创建了这样的查询来获得这个结果:
var results = await Car.findAndCountAll({
include: [{
model: Reservation,
where: {
$not: {
$or: [
{
dateIn: {
$between: [chosenIn, chosenOut],
}
},
{
dateOut: {
$between: [chosenIn, chosenOut],
}
}
]
}
},
required: true
}],
});但是,当每辆车只有一个预订时,一切都很好。如果我已经展示了结果将是汽车B和汽车A,可用预订从2016年10月17日到2016年10月18日。我不知道为什么一辆有多个预订的车被视为“独立的车身”,而不是一辆车。很明显,这个查询选择了所有满载至少一辆属于它们的预订的汽车。只有当他们所有的预订都被填满时,才应该列出它们。但不幸的是,我不能通过这个ORM来解决这个问题,我也不能在Sequelize文档中获得所需的信息。谢谢你的帮助。
发布于 2016-09-06 14:10:57
尝试使用.findAll()进行查询,然后通过cars.length获取汽车数量。结果将包含具有预订数组的唯一汽车。
在避免类似情况的位置中再添加一个表达式:如果选择2016年9月10日-2016年10月10日,则查询将返回carB,即使此时有保留
where:{
$not: {
$or: [
{
dateIn: {
$between: [chosenIn, chosenOut],
}
},
{
dateOut: {
$between: [chosenIn, chosenOut],
}
},
$and: [
{
dateIn: {
$lt: chosenIn,
}
},
{
dateOut: {
$gt: chosenIn,
}
},
]
]
}
}发布于 2016-09-06 06:56:28
设置日志记录,其中应包括生成的SQL,它将使您深入了解此问题:
var sequelize = new Sequelize('database', 'username', 'password', {
logging: console.log
logging: function (str) {
// do your own logging
}
});https://stackoverflow.com/questions/39336652
复制相似问题