我的数据库模型如下:
员工驾驶一辆或零辆车辆
一辆车可以由一名或多名员工驾驶
车辆有一个模型类型,可以告诉我们它的燃料类型以及其他信息。
我想要续集为我找到所有不开车的员工,或者如果他们开车,那么车辆不是柴油车。
因此,其中 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。
EDIT:
事实证明,解决方案是使用 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”,但我错过了放置内部的。我认为这不起作用,所以我放弃了这种方法。达哈尔马·古铁雷斯的回答让我意识到我需要两者才能发挥作用。