在 Sequelize 中一次查询两个组合字段
Query two combined fields at once in Sequelize
我的应用程序中有一个人名搜索框。候选人的姓名存储为 firstName,然后是 lastName。当我搜索应用程序时,应用程序输入提交对 ajax 函数的调用,我在其中有这段代码。
filters.where = {
$or: ['firstName', 'lastName', 'email'].map((item) =>
({[item]: {[queryClause]: `%${query}%`}}))
};
const scope = req.query.list;
const candidates = await CandidateModel.scope(scope).findAll(filters);
因此,如果我在搜索框中输入 "John",它会找到候选人,如果我输入单词 "Smith",它会找到候选人。
问题是,如果我输入全名 "John Smith",它不会出现,因为查询正在检查 "John Smith" 是否等于 "John",即名字,或者如果 "John Smith" 等于 "Smith",则姓氏。它不等于这两个。
有没有办法通过 sequalize 中的组合字段进行过滤,以便测试查询是否匹配 firstName 和 lastName 字段的组合?
似乎您可能必须拆分查询输入并搜索传入的术语的所有字段。例如:
var queryClause ='John Smith';
filters.where = {
$or: _.flatten(_.map(['firstName', 'lastName', 'email'], function(){
return _.map(queryClause.split(' '), function(q){
return {[item]: { $like : '%'+q+'%'}}
})
}))
}
这将输出如下内容:
{
"where": {
"$or": [{
"firstName": {
"$like": "%John%"
}
}, {
"firstName": {
"$like": "%Smith%"
}
}, {
"lastName": {
"$like": "%John%"
}
}, {
"lastName: {
"$like": "%Smith%"
}
},
{
"email": {
"$like": "%John%"
}
},
{
"email": {
"$like": "%Smith%"
}
}]
}
}
--顺便说一句,在上面的示例代码中使用 lodash
我找不到如何使用 sequelize 本机执行此操作,但您始终可以使用原始查询
sequelize.query('SELECT * FROM candidates where (firstName+lastName) like query OR email like query', { model: Candidate})
.then(function(projects){
// Each record will now be a instance of Candidate
})
使用类似下面的内容以这种形式按全名搜索 "firstName lastName"
Sequelize.where(Sequelize.fn("concat", Sequelize.col("firstName"), ' ', Sequelize.col("lastName")), {
$ilike: '%john smith%'
})
这样做可以解决名字或姓氏可能有空格的问题。
我的应用程序中有一个人名搜索框。候选人的姓名存储为 firstName,然后是 lastName。当我搜索应用程序时,应用程序输入提交对 ajax 函数的调用,我在其中有这段代码。
filters.where = {
$or: ['firstName', 'lastName', 'email'].map((item) =>
({[item]: {[queryClause]: `%${query}%`}}))
};
const scope = req.query.list;
const candidates = await CandidateModel.scope(scope).findAll(filters);
因此,如果我在搜索框中输入 "John",它会找到候选人,如果我输入单词 "Smith",它会找到候选人。
问题是,如果我输入全名 "John Smith",它不会出现,因为查询正在检查 "John Smith" 是否等于 "John",即名字,或者如果 "John Smith" 等于 "Smith",则姓氏。它不等于这两个。
有没有办法通过 sequalize 中的组合字段进行过滤,以便测试查询是否匹配 firstName 和 lastName 字段的组合?
似乎您可能必须拆分查询输入并搜索传入的术语的所有字段。例如:
var queryClause ='John Smith';
filters.where = {
$or: _.flatten(_.map(['firstName', 'lastName', 'email'], function(){
return _.map(queryClause.split(' '), function(q){
return {[item]: { $like : '%'+q+'%'}}
})
}))
}
这将输出如下内容:
{
"where": {
"$or": [{
"firstName": {
"$like": "%John%"
}
}, {
"firstName": {
"$like": "%Smith%"
}
}, {
"lastName": {
"$like": "%John%"
}
}, {
"lastName: {
"$like": "%Smith%"
}
},
{
"email": {
"$like": "%John%"
}
},
{
"email": {
"$like": "%Smith%"
}
}]
}
}
--顺便说一句,在上面的示例代码中使用 lodash
我找不到如何使用 sequelize 本机执行此操作,但您始终可以使用原始查询
sequelize.query('SELECT * FROM candidates where (firstName+lastName) like query OR email like query', { model: Candidate})
.then(function(projects){
// Each record will now be a instance of Candidate
})
使用类似下面的内容以这种形式按全名搜索 "firstName lastName"
Sequelize.where(Sequelize.fn("concat", Sequelize.col("firstName"), ' ', Sequelize.col("lastName")), {
$ilike: '%john smith%'
})
这样做可以解决名字或姓氏可能有空格的问题。