Nic*_*icT 3 mysql node.js express sequelize.js
我正在使用sequelize进行一些过滤.
我目前的表格结构:
我想过滤Table3和Table4,考虑到我只能使用顶级where子句过滤Table2.
我填写我的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) })
Run Code Online (Sandbox Code Playgroud)
我尝试使用我发现的一些黑客,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) })
Run Code Online (Sandbox Code Playgroud)
但这给了我一个错误,表2.Table3.Table4.table4id在字段列表中是未知的.
Adi*_*iii 10
您只需要放置的方式where
,您也可以创建选项对象,然后将其传递到您需要的位置
where condition
去include
required true and false
改变联合规则当使用include.where过滤预先加载的模型时,include.required将隐式设置为true.这意味着内部联接完成返回具有任何匹配子项的父模型.
sequelize称之为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) })
Run Code Online (Sandbox Code Playgroud) 归档时间: |
|
查看次数: |
11567 次 |
最近记录: |