簡體   English   中英

Sequelize:如何使用左外連接對連接表執行WHERE條件

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM