Sequelize:如何在连接表上使用左外连接

时间:2016-09-23 10:11:51

标签: javascript node.js sequelize.js

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

Picture of database diagram

我想要续集来把我们所有员工带到他们不开车的地方,或者如果他们这样做,那么车辆就不是柴油了。
所以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。

修改

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

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

}];

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

2 个答案:

答案 0 :(得分:7)

当您添加 where 子句时,sequelize会自动为您的代码添加 required: true 子句。

在您的包含细分中添加 required: false 可以解决问题

注意:您应该检查此问题iss4019

答案 1 :(得分:4)

急切加载

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

必需:false

会做

LEFT OUTER JOIN

必需:true

会做

INNER JOIN

了解更多详情docs.sequelizejs eager-loading

相关问题