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

Ste*_*eve 16 javascript node.js sequelize.js

我的数据库模型如下:
员工驾驶一辆或零辆
车辆车辆可由一名或多名员工
驾驶车辆的型号类型告诉我们其燃料类型.

数据库图的图片

我想要把所有员工都带到他们不开车的地方,或者如果他们这样做,那么车辆不是柴油车.
所以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);
Run Code Online (Sandbox Code Playgroud)

如果我运行以下内容:

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

employee
 .findAll(options)
 .success(function(results) {
     // do stuff
 });
Run Code Online (Sandbox Code Playgroud)

Sequelize做左外连接以获得包含的表格.因此,我找到了驾驶车辆而不是车辆的员工.
一旦我添加了选项的位置:

options.include = [{
    model: model.Vehicle,
    attributes: ['ID', 'ModelID'],
    include: [
        {
            model: model.VehicleModel,
            attributes: ['ID', 'IsDiesel']
            where: {
                IsDiesel: false
            }
        }]
}];
Run Code Online (Sandbox Code Playgroud)

Sequelize现在进行内连接以获取包含的表.
这意味着我只会让那些开车的员工和车辆不是柴油车.不包括驾驶车辆的员工.

从根本上说,我需要一种方法来告诉Sequelize做一个左外连接,同时有一个where条件,表明连接表中的列是false或null.

编辑:

事实证明,解决方案是使用required:false,如下所示:

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

}];
Run Code Online (Sandbox Code Playgroud)

我已经尝试过把第一个'必需:假'但是我错过了把内部的那个.我认为它不起作用所以我放弃了这种方法.Dajalmar Gutierrez的回答让我意识到我需要它才能发挥作用.

小智 12

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

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

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


Adi*_*iii 7

急切加载

当您从数据库中检索数据时,您很可能也希望获得与同一查询的关联- 这称为预先加载。这背后的基本思想是在调用 find 或 findAll 时使用 include 属性。当你设置

要求:假

会做

LEFT OUTER JOIN
Run Code Online (Sandbox Code Playgroud)

什么时候

要求:真实

会做

INNER JOIN
Run Code Online (Sandbox Code Playgroud)

有关更多详细信息docs.sequelizejs 预先加载