动态 where 子句 Sequelize
Dynamic where clauses Sequelize
我有以下代码:
const { TN, TITLE, QUEUE, TYPE, SERVICE, OWNER, CUSTOMER_ID, CUSTOMER_USER_ID, CREATE_BY, create_time, ESTADO_DO_SLA } = req.query;
let query = {};
if (TN != null) query.TN = TN;
if (TITLE != null) query.TITLE = TITLE;
if (QUEUE != null) query.QUEUE = QUEUE;
if (TYPE != null) query.TYPE = TYPE;
if (SERVICE != null) query.SERVICE = SERVICE;
if (OWNER != null) query.OWNER = OWNER;
if (CUSTOMER_ID != null) query.CUSTOMER_ID = CUSTOMER_ID;
if (CUSTOMER_USER_ID != null) query.CUSTOMER_USER_ID = CUSTOMER_USER_ID;
if (CREATE_BY != null) query.CREATE_BY = CREATE_BY;
const limit = req.query.limit != null ? Number.parseInt(req.query.limit) : 1000;
const page = req.query.page != null ? (Number.parseInt(req.query.page) * limit) - limit : 0;
const tickets = await ViewSLA.findAll({
raw: true,
offset: page,
limit: limit,
where: query
});
重点是,where 部分有效,但只有在值相等时才匹配,但我想做一些 Op.like 在某些参数中并保留其他可选参数。
例如,匹配 TN(票号)参数的确切值是有意义的,但我想按 TITLE 参数过滤,如果它被告知,使用 like 在 where 子句中。
这可能吗?
我刚找到一个方法:
const { TN, TITLE, QUEUE, TYPE, SERVICE, OWNER, CUSTOMER_ID, CUSTOMER_USER_ID, CREATE_BY, create_time, ESTADO_DO_SLA } = req.query;
let query = {};
if (TN != null) query.TN = TN;
if (TITLE != null) query.TITLE = {
[Op.like]: `%${TITLE}%`
};
if (QUEUE != null) query.QUEUE = QUEUE;
if (TYPE != null) query.TYPE = TYPE;
if (SERVICE != null) query.SERVICE = SERVICE;
if (OWNER != null) query.OWNER = OWNER;
if (CUSTOMER_ID != null) query.CUSTOMER_ID = CUSTOMER_ID;
if (CUSTOMER_USER_ID != null) query.CUSTOMER_USER_ID = CUSTOMER_USER_ID;
if (CREATE_BY != null) query.CREATE_BY = CREATE_BY;
if (ESTADO_DO_SLA != null) query.ESTADO_DO_SLA = ESTADO_DO_SLA;
const limit = req.query.limit != null ? Number.parseInt(req.query.limit) : countTickets;
const page = req.query.page != null ? (Number.parseInt(req.query.page) * limit) - limit : 0;
const tickets = await ViewSLA.findAll({
raw: true,
offset: page,
limit: limit,
where: query
});
工作得很好。
我有以下代码:
const { TN, TITLE, QUEUE, TYPE, SERVICE, OWNER, CUSTOMER_ID, CUSTOMER_USER_ID, CREATE_BY, create_time, ESTADO_DO_SLA } = req.query;
let query = {};
if (TN != null) query.TN = TN;
if (TITLE != null) query.TITLE = TITLE;
if (QUEUE != null) query.QUEUE = QUEUE;
if (TYPE != null) query.TYPE = TYPE;
if (SERVICE != null) query.SERVICE = SERVICE;
if (OWNER != null) query.OWNER = OWNER;
if (CUSTOMER_ID != null) query.CUSTOMER_ID = CUSTOMER_ID;
if (CUSTOMER_USER_ID != null) query.CUSTOMER_USER_ID = CUSTOMER_USER_ID;
if (CREATE_BY != null) query.CREATE_BY = CREATE_BY;
const limit = req.query.limit != null ? Number.parseInt(req.query.limit) : 1000;
const page = req.query.page != null ? (Number.parseInt(req.query.page) * limit) - limit : 0;
const tickets = await ViewSLA.findAll({
raw: true,
offset: page,
limit: limit,
where: query
});
重点是,where 部分有效,但只有在值相等时才匹配,但我想做一些 Op.like 在某些参数中并保留其他可选参数。
例如,匹配 TN(票号)参数的确切值是有意义的,但我想按 TITLE 参数过滤,如果它被告知,使用 like 在 where 子句中。
这可能吗?
我刚找到一个方法:
const { TN, TITLE, QUEUE, TYPE, SERVICE, OWNER, CUSTOMER_ID, CUSTOMER_USER_ID, CREATE_BY, create_time, ESTADO_DO_SLA } = req.query;
let query = {};
if (TN != null) query.TN = TN;
if (TITLE != null) query.TITLE = {
[Op.like]: `%${TITLE}%`
};
if (QUEUE != null) query.QUEUE = QUEUE;
if (TYPE != null) query.TYPE = TYPE;
if (SERVICE != null) query.SERVICE = SERVICE;
if (OWNER != null) query.OWNER = OWNER;
if (CUSTOMER_ID != null) query.CUSTOMER_ID = CUSTOMER_ID;
if (CUSTOMER_USER_ID != null) query.CUSTOMER_USER_ID = CUSTOMER_USER_ID;
if (CREATE_BY != null) query.CREATE_BY = CREATE_BY;
if (ESTADO_DO_SLA != null) query.ESTADO_DO_SLA = ESTADO_DO_SLA;
const limit = req.query.limit != null ? Number.parseInt(req.query.limit) : countTickets;
const page = req.query.page != null ? (Number.parseInt(req.query.page) * limit) - limit : 0;
const tickets = await ViewSLA.findAll({
raw: true,
offset: page,
limit: limit,
where: query
});
工作得很好。