我有一个数据库的文章与几列,并希望能够搜索title和description。目前,我有:
title
description
Article.findAll({ where: { title: { like: '%' + searchQuery + '%' } } });
我如何同时搜索描述?我已经通读了sequelize文档,甚至在Complex filtering / OR / NOT queries部分,但示例似乎只在一个专栏中解释了搜索。
Complex filtering / OR / NOT queries
sq1bmfud1#
const Op = Sequelize.Op; Article.findAll({ where: { title: { [Op.like]: '%' + searchQuery + '%' }, description: { [Op.like]: '%' + searchQuery2 + '%' } } });
Article.findAll({ where: { title: { like: '%' + searchQuery + '%' }, description: { like: '%' + searchQuery2 + '%' } } });
以上操作将确保title包含searchQuery,description包含searchQuery2。但是,如果您希望在文章包含这两个中的一个时返回结果,则应执行以下查询:
searchQuery
searchQuery2
const Op = Sequelize.Op; Article.findAll({ where: { [Op.or]: [ title: { [Op.like]: '%' + searchQuery + '%' }, description: { [Op.like]: '%' + searchQuery2 + '%' } ] } });
Article.findAll({ where: { $or: [ title: { like: '%' + searchQuery + '%' }, description: { like: '%' + searchQuery2 + '%' } ] } });
ruarlubt2#
续码〉= 4.12
Article.findAll({ where = { [Op.or]: [ { name: { [Op.like]: `%${req.query.query_string}%` } }, { description: { [Op.like]: `%${req.query.query_string}%` } } ] } });
仅供参考:mysql不支持iLike ;)
xfb7svmp3#
你的问题是我第一次听说sequelize.js,但我看了看文档,发现这:
Project.findOne({ where: { name: 'a project', $or: [ { id: [1,2,3] }, { id: { $gt: 10 } } ] } }) Project.findOne({ where: { name: 'a project', id: { $or: [ [1,2,3], { $gt: 10 } ] } } })
这两段代码将生成以下内容:
SELECT * FROM `Projects` WHERE ( `Projects`.`name` = 'a project' AND (`Projects`.`id` IN (1,2,3) OR `Projects`.`id` > 10) ) LIMIT 1;
这些示例上面的部分给出了允许的各种子句,包括$and和$or:
$and
$or
Project.findAll({ where: { id: { $and: {a: 5} // AND (a = 5) $or: [{a: 5}, {a: 6}] // (a = 5 OR a = 6) ... etc
rfbsl7qr4#
您应该使用以下命令:
where: { [op.or]: [ { model: { [op.like]: `%${ req.query.search }%` } }, { description: { [op.like]: `%${ req.query.search }%` } } ] }
hwamh0ep5#
如果你想在Model Sequelize中搜索所有列,这里有一个例子,你可以将每个列转换为varchar,这样就可以使用ilike操作符,并将它们推入数组中,这将是where子句,我的意思是,在这个例子中,repo是sequelize模型。
async findFilterAndCountAll(pg: { limit : number, offset : number, sort:string, order: string, pfilter : any}) { var filters = Array(); for (const key in this.repo.rawAttributes ) { console.log(key); filters.push(sequelize.where( sequelize.cast(sequelize.col(key), 'varchar'), {[Op.iLike]: `%tes%`} )) } return await this.repo.findAndCountAll({ limit : pg.limit, offset : pg.offset, order: [ [pg.order, pg.sort] ], where : { [Op.or]: filters } }); }
5条答案
按热度按时间sq1bmfud1#
序列化〉= 4.12
续接〈4.12
以上操作将确保
title
包含searchQuery
,description
包含searchQuery2
。但是,如果您希望在文章包含这两个中的一个时返回结果,则应执行以下查询:序列化〉= 4.12
续接〈4.12
ruarlubt2#
续码〉= 4.12
仅供参考:mysql不支持iLike ;)
xfb7svmp3#
你的问题是我第一次听说sequelize.js,但我看了看文档,发现这:
这两段代码将生成以下内容:
这些示例上面的部分给出了允许的各种子句,包括
$and
和$or
:rfbsl7qr4#
您应该使用以下命令:
hwamh0ep5#
如果你想在Model Sequelize中搜索所有列,这里有一个例子,你可以将每个列转换为varchar,这样就可以使用ilike操作符,并将它们推入数组中,这将是where子句,我的意思是,在这个例子中,repo是sequelize模型。