问题描述
嗨,我目前正在尝试从db查询记录,这些是条件
- 我从前端收到“ order by”,“ order(desc / asc)”,“ limit”和“ offset”
- 我还需要使用match ... against搜索记录。 “赞”搜索太慢。
- 此查询有一个映射的模型。
所以我尝试了
let order_by = req.query.orderby;
let order = req.query.order;
let page = req.query.pagenum;
let perpage = req.query.parpage;
let searchword = req.query.foodsearch;
let offset = (parseInt(page) - 1) * parpage;
let foods = await models.food.findAll({
limit: parseInt(perpage),offset: offset,order: [
[order_by,order]
],// where: Sequelize.literal
// (
// `MATCH
// (Name,Place,RestoNum,Ingredient,ChefName,Region...)
// AGAINST
// ( ? IN NATURAL LANGUAGE MODE)`,// { replacements: [ searchword ] }
// )
});
,但是注释的部分在此代码中似乎是错误的。 我尝试了原始查询,但是随后无法按顺序,偏移量,限制变量对这些顺序进行参数化。 我不想像$ {orderby}那样添加它们,因为这样做很冒险。
如果您对此问题有任何解决方案,请告诉我。
提前谢谢!
解决方法
您混淆了Sequelize.literal()
和sequelizeInstance.query()
API。
-
.literal()
only take a string。如果要对查询使用对象表示法,则注释的代码将起作用。除了没有第二个论点。您需要将搜索词连接或插入到AGAINST
子句中。 Also,don't forget your quotes。literal()
的输出本质上是一个字符串。您的MySQL FTS参数将需要使用正确的引号类型,就像它们会出现在原始SQL查询中一样。 -
.query()
DOES take an options parameter.通过此操作,您不必使用字符串插值you can use named replacements or bound-parameters。这样不仅可以将您放置在searchword
参数中,而且可以放置所需的任何ORDER BY子句。
我会选择选项1。这就是我们在MS SQL中为FTS做的事情。