在 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%'
                    })

这样做可以解决名字或姓氏可能有空格的问题。