2016-04-06 81 views
0

我的应用程序中有一个人名搜索框。候选人姓名存储为firstName,然后是lastName。当我搜索应用程序时,应用程序输入提交了一个调用ajax函数,我有这段代码。在Sequelize中一次查询两个组合字段

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”,即第一个名称,或者如果“约翰史密斯”等于“史密斯”,即最后一个名字。它不等于这些。

有没有一种方法可以通过sequalize中的组合字段进行过滤,因此它会测试查询是否与firstName和lastName字段相结合?

回答

1

好像你可能需要将查询输入和搜索对传入的条件的所有领域,例如:

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%" 
      } 
     }] 
} 
} 

--btw在以上示例代码中使用lodash代码

+1

如果名字/姓氏在其中包含多个单词,则不起作用。例如firstName ='Charles'lastName ='de Gaulle'。 – Yegor

0

我找不到如何使用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 
}) 
3

使用像下面这样通过全名以这种形式“姓”

Sequelize.where(Sequelize.fn("concat", Sequelize.col("firstName"), ' ', Sequelize.col("lastName")), { 
         $ilike: '%john smith%' 
        }) 

通过这样做,你修复名字或姓氏的问题可能有空格搜索。