sequelize嵌套包括与where子句
问题描述:
我正在使用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在字段列表未知。
答
你只需要顺便把where
,你也可以选择对象,然后通过它,你需要
- 把
where condition
在每一个include
如果需要 -
required true and false
变化joing规则
当一个渴望加载的模型使用include.where过滤,然后 include.required被隐式设置为t没错。这意味着一个内部的 连接完成返回父模型与任何匹配的子项。
-
sequelize称之为
eager-loading
访问更多的细节eager-loadingvar 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) })
你可以把其中的每个条款包括: – Adiii
@Adiii这给了我一个'未知列“Table2.Table3。 Table4.Table4id'in field list' error。 – NicT
你需要什么?其实,我没有得到你的问题,如果你需要内部包含where子句然后让我知道 – Adiii