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

时间:2016-09-05 19:32:16

标签: javascript mysql node.js orm sequelize.js

您好我遇到了一个问题,即找到最佳解决方案来查找和计算当前可用于预订的所有车辆。我的意思是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文档中获得必要的信息。谢谢你的帮助。

2 个答案:

答案 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
    }
});