Mysql sequelize嵌套的include with where子句
我正在使用sequelize进行一些过滤 我当前的表格结构:Mysql sequelize嵌套的include with where子句,mysql,node.js,express,sequelize.js,Mysql,Node.js,Express,Sequelize.js,我正在使用sequelize进行一些过滤 我当前的表格结构: 表1包含项目(具有图像)和用户(不相关) 表1通过表1上的表2ID与表2有直接关系(而不是表3) 表2通过表2上的表3ID与表3有直接关系(而不是表4) 表3通过表3上的表4ID与表4有直接关系 我也想在表3和表4上进行过滤,因为我只能使用顶级where子句在表2上进行过滤 我填写where条件的方式仅使用基本对象: var Table2id = parseInt(req.query.Table2id) || null
- 表1包含项目(具有图像)和用户(不相关)
- 表1通过表1上的表2ID与表2有直接关系(而不是表3)
- 表2通过表2上的表3ID与表3有直接关系(而不是表4)
- 表3通过表3上的表4ID与表4有直接关系
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
,但没有用
如何筛选嵌套的包含项?有没有其他方法可以构造查询,这样我就不必嵌套include,但仍然保留此数据结构(有没有比我想象的更好的方法来构造此数据结构)
edit:因此我希望能够对包含的表进行排序,并且在顶级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在字段列表中是未知的。您只需要知道将
放在哪里的方法,您还可以创建option对象,然后将其传递到需要的地方
- 在每个
中放入条件
,必要时包括
要求正确和错误
更改连接规则
当使用include.where筛选急切加载的模型时
include.required隐式设置为true。这意味着
连接是通过返回具有任何匹配子项的父模型来完成的
- sequelize称之为“急切加载”
更多详细信息,请访问
var Table2=require(“../models/”)。表2//还有你需要的其他模型
var选项={
极限:极限,
抵销:抵销,
订单:“在描述处创建”,
其中:{已删除:0},
包括:[
{
型号:用户,
},
{
型号:项目,
要求:正确,
包括:[
{
型号:图片,
},
],
},
{
型号:表2,
包括:[
{
型号:表3,
其中:{已删除:0},
包括:[
{
型号:表4,
其中:{已删除:0},
},
],
},
],
},
],
};
表1.findAndCountAll(选项)。然后(函数(结果){
res.json(结果);
});
您可以在每个include@Adiii这在字段列表中给了我一个未知列“Table2.Table3.Table4.Table4id”
错误。您需要什么?事实上,我没有收到您的问题,如果您需要内部include中的where子句,请告诉我var user=require(“../models/”)。表1;var user=require('../models/')。表2;include:[{model:table1,required:true,include:[{model:table2,required:true,其中:{condition}]}]但是你在里面放东西的方式包括 根据doc,它是无效的