提问人:nargyriou 提问时间:11/6/2023 更新时间:11/6/2023 访问量:24
节点 .js 续集 筛选器中的组合计数
Node.js Sequelize combine count in filter
问:
我正在使用 Sequelize 开发一个 Node.JS 项目。
我有一个服务,它从前端接收多个过滤器,它组合了这些过滤器以回答。
我有文档,Email_Logs具有 M-N 连接的实体。
我有一个特定的过滤器,用于显示已发送或未发送相关电子邮件的记录。
我定义:
- 发送:is_mail_sent=1
- 未发送:is_mail_sent=null
- 两者:is_mail_sent:-1
第一种情况正在工作。 在第二种情况下,我想要:
COUNT(Doc_Email_Logs)=0 或 (COUNT(Doc_Email_Logs)>0 和 Doc_Email_Logs.status=0)
但我无法弄清楚如何在过滤器中包含计数。
法典:
const { doc_types, order_id, loading_id, from_date, to_date, is_mail_sent, supplier_id, client_id, transporter_id, order_category_id } = req.query;
let filter = {};
if (order_id !== 'null') {
filter['$order_load_docs.order_id$'] = {
[Op.like]: `%${order_id}%`,
};
}
if (loading_id !== 'null') {
filter['$order_load_docs.loading_id$'] = {
[Op.like]: `%${loading_id}%`,
};
}
if (supplier_id !== 'null') {
filter['$order_load_docs.supplier_id$'] = {
[Op.eq]: `${supplier_id}`,
};
}
if (client_id !== 'null') {
filter['$order_load_docs.client_id$'] = {
[Op.eq]: `${client_id}`,
};
}
if (order_category_id !== 'null') {
filter['$order_load_docs.order_category_id$'] = {
[Op.eq]: `${order_category_id}`,
};
}
const normalizeDocTypes = Array.isArray(doc_types)
? doc_types
: doc_types
? [doc_types]
: [];
if (normalizeDocTypes.length > 0) {
filter["$type.id$"] = {
[Op.in]: normalizeDocTypes,
};
}
if (from_date!=='null' && to_date!=='null') {
filter.createdAt = {
[Op.between]: [new Date(from_date), new Date(to_date)],
};
}
console.log(is_mail_sent)
if(is_mail_sent==1){ //Sent
filter['$Doc_Email_Logs.status$'] = {
[Op.eq]: is_mail_sent,
};
}
if(is_mail_sent=='null'){ //Not Sent
console.log('edw')
filter['$Doc_Email_Logs.status$'] = {
[Op.eq]: 0
};
}
if(is_mail_sent==-1){ //Both
}
// if (is_mail_sent!==null || is_mail_sent!==-1) {
// if(is_mail_sent==1){
// filter['$Doc_Email_Logs.status$'] = {
// [Op.eq]: is_mail_sent,
// };
// }else{
// filter['$Doc_Email_Logs.status$'] = {
// [Op.or]: [
// { [Op.eq]: null }, // Count = 0
// {
// [Op.and]: [
// { [Op.ne]: null }, // Count > 0
// { [Op.not]: { [Op.col]: 'Doc_Email_Logs.status' } } // Status <> 1
// ]
// }
// ]
// };
// }
// }
// if(is_mail_sent==-1){ //Both Sent and not sent
// filter['$Doc_Email_Logs.status$'] = {
// [Op.or]: [
// { [Op.eq]: 1 }, // Case 1: is_mail_sent equals 1
// {
// [Op.or]: [
// { [Op.eq]: null }, // Count = 0
// {
// [Op.and]: [
// { [Op.ne]: null }, // Count > 0
// { [Op.not]: { [Op.col]: 'Doc_Email_Logs.status' } }, // Status <> 1
// ],
// },
// ],
// },
// ],
// };
// }
return Document.findAll({
where: filter,
include: [
{
model: db.document_type,
as: 'type',
attributes: ['type_name', 'type_color']
},
{
model: db.order_loading_document_j,
as: 'order_load_docs',
attributes: ['loading_id', 'order_id', 'supplier_id','client_id' , 'order_category_id', 'added_by']
},
{
model: db.email_log,
as: 'Doc_Email_Logs',
attributes: ['status', 'status_text', 'createdAt']
}
],
order: db.sequelize.literal('createdAt DESC'),
attributes: ['id', 'local_path', 'filesize', 'web_path', 'createdAt']
})
双
答: 暂无答案
评论