[英]Sequelize: how to do a WHERE condition on joined table with left outer join
我的数据库模型如下:
员工驾驶一辆或零辆车
车辆可以由一个或多个雇员驾驶
车辆具有模型类型,告诉我们其中的燃料类型。
我想要把所有员工都带到他们不开车的地方,或者如果他们这样做,那么车辆不是柴油车。
所以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
}];
我已经尝试过把第一个'必需:假'但是我错过了把内部的那个。 我认为它不起作用所以我放弃了这种方法。 Dajalmar Gutierrez的回答让我意识到我需要它才能发挥作用。
添加where子句时,sequelize会自动为您的代码添加required: true
子句。
向include段添加required: false
应该可以解决问题
注意:你应该检查这个问题iss4019
渴望加载
当您从数据库中检索数据时,您很可能也希望获得与同一查询的关联 - 这称为预先加载 。 其背后的基本思想是在调用find或findAll时使用属性include。 当你设置
必需:false
会做
LEFT OUTER JOIN
什么时候
要求:是的
会做
INNER JOIN
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.