正确查询基于查找所有对象有很多关系

你好,我遇到了一个问题,find最好的解决scheme,find并计算所有可用于预订的汽车。 我的意思是车模和预约模型之间有这样的关系:

Reservation.belongsTo(Car); Car.hasMany(Reservation, {foreignKey: { allowNull: false }}); 

然后,我需要find所有可供用户在他/她select的时间段内预定的车辆。 例如,让我们想象一下这样的情况:我们有3辆车,A,B,C和:

汽车 – 答:现在有两个保留 – 从2016年10月10日至2016年10月13日和从17.10.2016 – 18.10.2016

车B:有一个保留 – 8.10.2016 – 11.10.2016

车C:一次预约 – 15.10.2016 – 16.10.2016

用户希望从12.10.2016至16.10.2016预定一辆车。

因此,他只能得到一辆车select:汽车乙

我创build了这样的查询来得到这个结果:

  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日预订的汽车B和汽车A. 我不知道为什么有一个以上的保留汽车被视为“独立的身体”不像一辆车。 很明显,这个查询select所有满足至less一个保留的汽车。 只有在所有预订完成后才能列出。 但不幸的是我不能通过这个ORM来克服这个问题,我也不能在Sequelize文档中获得必要的信息。 谢谢你的帮助。

尝试使用.findAll()查询,然后通过cars.length获得汽车的cars.length 。 结果将包含与保留arrays的独特的汽车。

并添加一个expression式,以避免这样的情况:如果您select了09.10.2016-10.10.2016date,那么此时您的查询将返回carB,即使它已经保留

 where:{ $not: { $or: [ { dateIn: { $between: [chosenIn, chosenOut], } }, { dateOut: { $between: [chosenIn, chosenOut], } }, $and: [ { dateIn: { $lt: chosenIn, } }, { dateOut: { $gt: chosenIn, } }, ] ] } } 

安装程序日志应该包括生成的SQL,这将使您深入了解这个问题:

 var sequelize = new Sequelize('database', 'username', 'password', { logging: console.log logging: function (str) { // do your own logging } });