2016-09-23 50 views
7

我的數據庫模型如下:
僱員驅動一個或零車輛
的車輛可以由一個或多個員工
的車輛驅動有一個模型類型,告訴我們它的燃料類型等。Sequelize:如何做一個WHERE與左外連接表的條件加入

Picture of database diagram

我想sequelize,他們不駕駛車輛去給我拿所有的員工,或者如果他們這樣做,則車輛沒有柴油。
那麼,VehicleID爲空或Vehicle.VehicleModel.IsDiesel =假

我當前的代碼如下:

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。

編輯:

事實證明,該解決方案是使用要求:假的,如下圖所示:

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

}]; 

我已經試圖把第一個「要求:假」,但我錯過了放在內在的一個。我認爲這是行不通的,所以我放棄了這種做法。 Dajalmar Gutierrez的回答讓我意識到我需要這兩項工作。

回答

5

當您添加其中條款,sequelize自動添加一個required: true子句來你的代碼。

添加required: false到您的包括段應該解決的問題

注意:您應該檢查這個問題iss4019

+0

已解決。非常感謝。我編輯了我的帖子以顯示正確的解決方案。您鏈接到的頁面上的關鍵句子是:「我包含嵌套包含,並且我錯過了一個嵌套包含中的require:false子句......設置它使代碼工作」。讀完之後,我意識到我做了同樣的事情。 – Steve

3

預先加載

當你從數據庫中檢索數據有一個公平的機會,你也想得到協會具有相同的查詢 - 這被稱爲渴望加載。其背後的基本思想是在調用find或findAll時使用屬性include。 當你設置需要

:假

會做

LEFT OUTER JOIN 

時,需要

:真

會做

INNER JOIN 

更多詳細信息docs.sequelizejs eager-loading