[英]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.