【问题标题】:Proper query for finding all objects based on has many relation查找所有对象的正确查询有很多关系
【发布时间】:2016-09-05 19:32:15
【问题描述】:

您好,我在寻找最佳解决方案来查找和统计所有当前可供预订的汽车时遇到了问题。我的意思是 Car 模型和 Reservation 模型之间存在这样的关系:

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

然后我需要找到用户在他/她选择的时间段内可以预订的所有汽车。例如让我们想象一下这种情况: 我们有 3 辆车 A、B、C 和:

汽车 A:现在有两个预订 - 从 10.10.2016 到 13.10.2016 和从 17.10.2016 - 18.10.2016

B 车:有一个预订 - 8.10.2016 - 11.10.2016

C 车:1 次预订 - 15.10.2016 - 16.10.2016

用户想要从 12.10.2016 到 16.10.2016 预订一辆车。

因此,他应该只收到一辆车可供选择:CAR B

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

  var results = await Car.findAndCountAll({
    include: [{
      model: Reservation,
      where: {
        $not: {
          $or: [
            {
              dateIn: {
                $between: [chosenIn, chosenOut],
              }
            },
            {
              dateOut: {
                $between: [chosenIn, chosenOut],
              }
            }
          ]
        }
      },
      required: true
    }],
  });

但是当每辆车只有一个预订时,一切都很好。如果我显示结果将是从 17.10.2016 到 18.10.2016 可用预订的 Car Car B 和 Car A。我不知道为什么一辆有多个预订的汽车被视为“独立车身”而不是一辆汽车。很明显,这个查询选择了所有满足至少一个 Reservation 的汽车。仅当它们的所有预订均已满时,才应列出它们。但不幸的是,我无法通过这个 ORM 克服这个问题,我也无法在 Sequelize 文档中获得必要的信息。感谢您的帮助。

【问题讨论】:

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


    【解决方案1】:

    尝试使用.findAll()查询,然后通过cars.length获取汽车数量。结果将包含具有一系列预订的独特汽车。

    并在 where 中再添加一个表达式来避免这样的情况: 如果您选择 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,
                  }
              },
            ]
          ]
        }
    }
    

    【讨论】:

      【解决方案2】:

      设置日志记录,其中应包含生成的 SQL,这将使您深入了解此问题:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-02-13
        • 2019-04-23
        • 2017-06-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-07-24
        • 2011-06-06
        相关资源
        最近更新 更多