2017-04-02 109 views
2

我正在使用sequelize進行一些過濾。sequelize嵌套包括與where子句

我的當前表的結構:

  • 表1保持物品(其具有圖像)和用戶(不相關)
  • 表1具有表2通過Table2id上表1(不按表3)
  • 直接的關係表2與表3通過表3到表3的直接關係(不是表4)
  • 表3與表4通過表4的表4直接關係表3

我想過濾表3和表4,考慮到我只能使用頂級where子句在表2上過濾。

的方式我填寫我的WHERE條件只使用一個基本對象:

var Table2id  = parseInt(req.query.Table2id) || null, 
    Table3id  = parseInt(req.query.Table3id) || null, 
    Table4id  = parseInt(req.query.Table4id) || null, 
    whereCondition = { deleted: 0 } 

if (Table2id) { whereCondition['table2id'] = Table2id } 
if (Table3id) { whereCondition['table3id'] = Table3id } 
if (Table4id) { whereCondition['table4id'] = Table4id } 

Table1.findAndCountAll({ 
     limit: limit, 
     offset: offset, 
     order: 'created_at DESC', 
     where: whereCondition, 
     include: [ 
      { 
       model: User, 
      }, { 
       model: Item, 
       include: [ 
        { 
         model: Image 
        } 
       ] 
      }, { 
       model: Table2, 
       include: [ 
        { 
         model: Table3, 
         include: [ 
          { 
           model: Table4, 
          } 
         ] 
        } 
       ] 
      } 
     ], 
}).then(function (results) { res.json(results) }) 

我嘗試使用一些黑客,我發現像whereCondition['$Table3.table3id$'] = Table3id但無濟於事。

如何過濾嵌套包括?有沒有另外一種方法可以構建查詢,所以我不需要嵌套包含,但仍然保留這個數據結構(有沒有更好的方法來構造這個比我想象的更多)?

編輯:所以我想都能夠對包含的表進行排序,並且至少有一個參數在頂級where子句中設置(如deleted = 0)。

我試着修改查詢,如下所示:

var Table2id  = parseInt(req.query.Table2id) || null, 
    Table3id  = parseInt(req.query.Table3id) || null, 
    Table4id  = parseInt(req.query.Table4id) || null, 
    whereCondition = { deleted: 0 }, 
    extraWhereCondition = {} 

if (Table2id) { whereCondition['table2id'] = Table2id } // figured this can be left alone in this particular case (as it works in top-level where clause) 
if (Table3id) { extraWhereCondition['table3id'] = Table3id } 
if (Table4id) { extraWhereCondition['table4id'] = Table4id } 

Table1.findAndCountAll({ 
     limit: limit, 
     offset: offset, 
     order: 'created_at DESC', 
     where: whereCondition, 
     include: [ 
      { 
       model: User, 
      }, { 
       model: Item, 
       include: [ 
        { 
         model: Image 
        } 
       ] 
      }, { 
       model: Table2, 
       include: [ 
        { 
         model: Table3, 
         where: extraWhereCondition, 
         include: [ 
          { 
           model: Table4, 
           where: extraWhereCondition, 
          } 
         ] 
        } 
       ] 
      } 
     ], 
}).then(function (results) { res.json(results) }) 

但是這給了我一個錯誤,Table2.Table3.Table4.table4id在字段列表未知。

+0

你可以把其中的每個條款包括: – Adiii

+0

@Adiii這給了我一個'未知列「Table2.Table3。 Table4.Table4id'in field list' error。 – NicT

+0

你需要什麼?其實,我沒有得到你的問題,如果你需要內部包含where子句然後讓我知道 – Adiii

回答

3

你只需要順便把where,你也可以選擇對象,然後通過它,你需要

  • where condition在每一個include如果需要
  • required true and false變化joing規則

當一個渴望加載的模型使用include.where過濾,然後 include.required被隱式設置爲t沒錯。這意味着一個內部的 連接完成返回父模型與任何匹配的子項。

  • sequelize稱之爲eager-loading訪問更多的細節eager-loading

    var Table2=require('../models/').table2;//and other model that u need 
    
    var option={limit: limit, 
         offset: offset, 
         order: 'created_at DESC', 
         where:{ deleted: 0 } 
         include: [ 
          { 
           model: User, 
    
          }, { 
           model: Item,required: true, 
    
           include: [ 
            { 
             model: Image 
            } 
           ] 
          }, { 
           model: Table2, 
           include: [ 
            { 
             model: Table3, 
             where:{ deleted: 0 } 
             include: [ 
              { 
               model: Table4, 
               where:{ deleted: 0 } 
              } 
             ] 
            } 
           ] 
          } 
         ] 
        } 
    
        Table1.findAndCountAll(option) 
        .then(function (results) { res.json(results) })