tri*_*e84 8 mysql node.js sequelize.js
我正在使用sequelize ORM来处理我正在研究的node.js项目.我有一个查询,我需要对多列的连接结果执行类似的操作.
例如,类似于以下内容:
SELECT*FROM People WHERE(CONCAT(firstname,'',lastname))LIKE'%John Do%'.
我使用以下语法,并想知道这是否可行,而不必诉诸使用RAW查询(在我的解决方案中没有其他地方).
var criteria = {
include: [
occupation
],
where: {
is_active: 1
},
nest: false
};
db.people.findAll(criteria, {}).then(function(people) {
success(people);
}).catch(function(err) {
error(err);
});
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
cod*_*aff 18
你需要这样的东西
var criteria = {
where: Sequelize.where(Sequelize.fn("concat", Sequelize.col("firstname"), Sequelize.col("lastname")), {
like: '%John Do%'
})
}
Run Code Online (Sandbox Code Playgroud)
注意:未经测试
yji*_*imk 13
受@ code-jaff的启发,但你需要在名字和姓氏之间连接一个空格字符串,以使其正常工作.否则它只会返回'JohnDoe'而不是'John Doe'.这是代码.
Sequelize.where(Sequelize.fn('concat', Sequelize.col('firstName'), ' ', Sequelize.col('lastName')), {
like: '% John Doe %'
})
Run Code Online (Sandbox Code Playgroud)
要为可能无法理解查询位置的人提供一些上下文,这是where或statement中上述代码的示例.req.body.query是您正在发布的变量搜索词.
Users.findAll({
where: {
$or: [
Sequelize.where(Sequelize.fn('concat', Sequelize.col('firstName'), ' ', Sequelize.col('lastName')), {
like: '%' + req.body.query + '%'
}),
{ email: { $like: '%' + req.body.query + '%' } },
{ companyName: { $like: '%' + req.body.query + '%' } }
]
}
})
Run Code Online (Sandbox Code Playgroud)
Sequelize 4.0的更新
基于字符串的运算符($like以及$or上面的示例)已被弃用,以支持基于符号的运算符.这对安全来说是件好事
请参阅:http://docs.sequelizejs.com/manual/tutorial/querying.html#operators
这些运算符将替换为[Sequelize.Op.like]和[Sequelize.Op.or].还有其他方法可以在其文档中突出显示的续集选项中进行配置
我能够根据 @yjimk 答案使用新的续集版本 5.21.13 实现这一目标。
Users.findAll({
where: {
[sequelize.Op.or]:{
namesQuery: sequelize.where(
sequelize.fn(
"concat",
sequelize.col("firstName"),
" ",
sequelize.col("lastName")
),
{
[sequelize.Op.like]: `%${req.body.query}%`,
}
),
email: {[sequelize.Op.like]: `%${req.body.query}%`},
companyName: {[sequelize.Op.like]: `%${req.body.query}%`},
}
})
Run Code Online (Sandbox Code Playgroud)