在 Sequelize 中一次查询两个组合字段

Posted

技术标签:

【中文标题】在 Sequelize 中一次查询两个组合字段【英文标题】:Query two combined fields at once in 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 字段?

【问题讨论】:

【参考方案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'。

以上是关于在 Sequelize 中一次查询两个组合字段的主要内容,如果未能解决你的问题,请参考以下文章

使用 Sequelize.js 和 PostgreSQL 在关联模型上查询 JSONB 字段

如何在 Prometheus 中一次调用执行多个查询

在 Mongoose 中一次执行多个查询

表A中一条记录的两个字段都对应于表B的同一个字段 如何查询?SQL, thinkphp[5]

使用 Sequelize 在 GraphQL 查询中将日期时间字段输出为字符串

在 Django 中一次更新所有模型