【问题标题】:Query two combined fields at once in Sequelize在 Sequelize 中一次查询两个组合字段
【发布时间】:2016-07-27 02:45:24
【问题描述】:

我的应用程序中有一个人名搜索框。候选人的姓名存储为 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 字段?

【问题讨论】:

    标签: sql node.js sequelize.js


    【解决方案1】:

    使用类似下面的内容以这种形式“firstName lastName”按全名搜索

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

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

    【讨论】:

    • 我如何在你的方法中使用多个 where 条件?
    • Sequelize.where 是一个可链接的函数。所以试试 Sequelize.where(,,).where(,,)
    • @MinaLuke 可链式在我这边不起作用
    • 这也很有效。 where(fn("concat", col("firstName"), " ", col("lastName")), { [Op.iLike]: `%${search}%`, })
    【解决方案2】:

    我找不到如何在本地使用 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】:

      似乎您可能必须拆分查询输入并搜索传入术语的所有字段。例如:

      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

      【讨论】:

      • 如果名字/姓氏中有多个单词,那将不起作用。例如 firstName='Charles' lastName='de Gaulle'。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-25
      • 2016-10-30
      • 2023-03-17
      • 1970-01-01
      • 2015-06-25
      相关资源
      最近更新 更多