首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >查找所有对象的正确查询具有多个关系

查找所有对象的正确查询具有多个关系
EN

Stack Overflow用户
提问于 2016-09-06 03:32:16
回答 2查看 49关注 0票数 2

您好,我遇到了一个问题,找到最好的解决方案,以查找和计数所有的汽车,目前可供预订。我的意思是在汽车模型和预订模型之间有这样的关系:

代码语言:javascript
复制
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

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

代码语言:javascript
复制
  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文档中获得所需的信息。谢谢你的帮助。

EN

回答 2

Stack Overflow用户

发布于 2016-09-06 14:10:57

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

在避免类似情况的位置中再添加一个表达式:如果选择2016年9月10日-2016年10月10日,则查询将返回carB,即使此时有保留

代码语言:javascript
复制
where:{
    $not: {
      $or: [
        {
          dateIn: {
            $between: [chosenIn, chosenOut],
          }
        },
        {
          dateOut: {
            $between: [chosenIn, chosenOut],
          }
        },
        $and: [
          {
              dateIn: {
                  $lt: chosenIn,
              }
          },
          {
              dateOut: {
                  $gt: chosenIn,
              }
          },
        ]
      ]
    }
}
票数 1
EN

Stack Overflow用户

发布于 2016-09-06 06:56:28

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

代码语言:javascript
复制
var sequelize = new Sequelize('database', 'username', 'password', {
    logging: console.log
    logging: function (str) {
        // do your own logging
    }
});
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39336652

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档