2016-04-06 80 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%' 
        }) 

通過這樣做,你修復名字或姓氏的問題可能有空格搜索。