使用Sequelize版本实现:“^ 4.15.0”
我试图从包含的关联中的2级添加where条件。
Model1.find({
include: [
{
model: Model2,
as: 'model2_alias',
attributes: [
'model2_id'
],
include: [{
model: Model3,
as: 'model3_alias',
attributes: [
'model3_id'
]
}]
}
],
where: {
model3_alias.id: { [Op.in]: [1, 2, 3] }
}
});
我累了这个方法:
where: {
'$model2_alias.model3_alias.id$': { [Op.in]: [1, 2, 3] }
}
但是给出了model2_alias.model3_alias.id
未定义/未找到的错误。
当写为'$model2_alias.id$': { [Op.in]: [1, 2, 3] }
时,上面的确有效,因此语法必须写入,但如何再降低一级。
在任何MySQL管理工具中执行形成的SQL语句时,给出正确的结果,因此我尝试实现的where
条件也没有错。
我在这里缺少的任何想法或仅适用于一个级别。然后该怎么做更多级别?
你可以在任何级别添加这样的地方 -
Model.find({
where : {
// where 1
},
include : [{
model : Model1,
where : {
// Where 2
},
include : [{
model : Model2,
where : {
// Where 3
}
}]
}]
});
希望有所帮助!
我假设您的代码不起作用,因为您使用model1_id
而不是id
。所以代码应该是
Model1.find({
include: [
{
model: Model2,
as: 'model2_alias',
attributes: [
'id'
],
include: [{
model: Model3,
as: 'model3_alias',
attributes: [
'id'
]
}]
}
],
where: {
'$model2_alias.model3_alias.id$': { [Op.in]: [1, 2, 3] }
}
});
另外,正如@Rahul所提到的,您也可以直接在包含内部使用
Model1.find({
include: [
{
model: Model2,
as: 'model2_alias',
attributes: [
'id'
],
include: [{
model: Model3,
where: {
'id': { [Op.in]: [1, 2, 3] }
}
as: 'model3_alias',
attributes: [
'id'
]
}]
}
],
});
此外,你可以试试
sequelize.where()
EG
sequelize.where(
sequelize.literal('"model2_alias.model3_alias.id"'), { [Op.in]: [1, 2, 3] }
)
关于sub query
,这意味着你使用limit
/ offset
+(1:m
关系或有left join
)。如果你有1:1
关系,只需将required: true
添加到include
,你将获得inner join
而不是left join
和sequelize
不会创建sub query
。