节点 .js 续集 筛选器中的组合计数

Node.js Sequelize combine count in filter

提问人:nargyriou 提问时间:11/6/2023 更新时间:11/6/2023 访问量:24

问:

我正在使用 Sequelize 开发一个 Node.JS 项目。

我有一个服务,它从前端接收多个过滤器,它组合了这些过滤器以回答。

我有文档,Email_Logs具有 M-N 连接的实体。

我有一个特定的过滤器,用于显示已发送或未发送相关电子邮件的记录。

我定义:

  1. 发送:is_mail_sent=1
  2. 未发送:is_mail_sent=null
  3. 两者: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']
  })

SQL 筛选器 续集 .js

评论


答: 暂无答案