2016-09-23 341 views
7

我的数据库模型如下:
雇员驱动一个或零车辆
的车辆可以由一个或多个员工
的车辆驱动有一个模型类型,告诉我们它的燃料类型等。Sequelize:如何做一个WHERE与左外连接表的条件加入

Picture of database diagram

我想sequelize,他们不驾驶车辆去给我拿所有的员工,或者如果他们这样做,则车辆没有柴油。
那么,VehicleID为空或Vehicle.VehicleModel.IsDiesel =假

我当前的代码如下:

var employee = sequelize.define('employee', { 
    ID: Sequelize.INTEGER, 
    VehicleID: Sequelize.INTEGER 
}); 

var vehicle = sequelize.define('vehicle', { 
    ID: Sequelize.INTEGER, 
    ModelID: Sequelize.INTEGER 
}); 

var vehicleModel = sequelize.define('vehicleModel', { 
    ID: Sequelize.INTEGER, 
    IsDiesel: Sequelize.BOOLEAN 
}); 

employee.belongsTo(vehicle); 
vehicle.belongsTo(vehicleModel); 

如果我运行以下命令:

options.include = [{ 
    model: model.Vehicle, 
    attributes: ['ID', 'ModelID'], 
     include: [ 
     { 
      model: model.VehicleModel, 
      attributes: ['ID', 'IsDiesel'] 
     }] 
}]; 

employee 
.findAll(options) 
.success(function(results) { 
    // do stuff 
}); 

Sequelize做了左外部联接让我包含表格。所以我得到了开车的员工,而不是。
只要我一个,其中添加到我的选择:

options.include = [{ 
    model: model.Vehicle, 
    attributes: ['ID', 'ModelID'], 
    include: [ 
     { 
      model: model.VehicleModel, 
      attributes: ['ID', 'IsDiesel'] 
      where: { 
       IsDiesel: false 
      } 
     }] 
}]; 

Sequelize现在做一个内连接来获得包括表。
这意味着我只获得开车的员工,车辆不是柴油。不开车的员工不在此列。

基本上,我需要一种告诉Sequelize做一个左外连接的方法,同时还有一个where条件来声明来自连接表的列是false或null。

编辑:

事实证明,该解决方案是使用要求:假的,如下图所示:

options.include = [{ 
    model: model.Vehicle, 
    attributes: ['ID', 'ModelID'], 
    include: [ 
     { 
      model: model.VehicleModel, 
      attributes: ['ID', 'IsDiesel'] 
      where: { 
       IsDiesel: false 
      }, 
      required: false 
     }], 
    required: false 

}]; 

我已经试图把第一个“要求:假”,但我错过了放在内在的一个。我认为这是行不通的,所以我放弃了这种做法。 Dajalmar Gutierrez的回答让我意识到我需要这两项工作。

回答

5

当您添加其中条款,sequelize自动添加一个required: true子句来你的代码。

添加required: false到您的包括段应该解决的问题

注意:您应该检查这个问题iss4019

+0

已解决。非常感谢。我编辑了我的帖子以显示正确的解决方案。您链接到的页面上的关键句子是:“我包含嵌套包含,并且我错过了一个嵌套包含中的require:false子句......设置它使代码工作”。读完之后,我意识到我做了同样的事情。 – Steve

3

预先加载

当你从数据库中检索数据有一个公平的机会,你也想得到协会具有相同的查询 - 这被称为渴望加载。其背后的基本思想是在调用find或findAll时使用属性include。 当你设置需要

:假

会做

LEFT OUTER JOIN 

时,需要

:真

会做

INNER JOIN 

更多详细信息docs.sequelizejs eager-loading