2017-04-02 211 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) })