在 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 字段
表A中一条记录的两个字段都对应于表B的同一个字段 如何查询?SQL, thinkphp[5]