Sequelize:如何使用左外连接对连接表执行WHERE条件

我的数据库模型如下:
一名员工驾驶一辆或零辆车
一辆车可以由一名或多名员工驾驶
车辆有一个模型types,告诉我们它的燃料types等。

数据库图的图片

我想继续把我们所有的员工带到不驾驶车辆的地方,或者如果他们这样做,那么车辆不是柴油的。
那么VehicleID为null或者Vehicle.VehicleModel.IsDiesel = false

我目前的代码如下:

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。

编辑:

事实certificate,解决scheme是使用required:false,如下所示:

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

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

当你添加一个where子句时,sequelize会自动在你的代码中添加一个required: true子句。

如果required: false添加required: false ,则可以解决问题

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

急切的加载

当您从数据库中检索数据时,您也希望获得相同查询的相关性 – 这被称为“ 急切加载” 。 背后的基本思想是在调用find或findAll时使用属性include。 当你设置

required:false

会做

 LEFT OUTER JOIN 

什么时候

required:true

会做

 INNER JOIN 

欲了解更多信息docs.sequelizejs急切加载