如何在 Sequelize 和 Node.js 中使用 "LIKE" 条件?

4

我正在尝试从表中过滤数据,想要使用多个条件。当我在查询中应用“like”时,它会显示应用程序错误。 如何做到这一点?

我正在使用Node.js框架、Express、Sequelize和MySQL。

router.get('/booking-information', function (req, res) {
  // Get orders
  Promise.all([Order.findAll({
    /*where: {
      endDate: null,
    },*/
    order: [
    ['id', 'DESC'],
    ]
    }),
    Professional.findAll({where: {status : '1'}})
  ])
    .then(([orders, professionals]) => {
      orders.map((order) => {
        let professionalsInSameArea = professionals.filter((professional) => {
          return (professional.service === order.service || professional.secondary_service LIKE '%' + order.service + '%') && (professional.area === order.area || order.area === professional.secondary_area);
        });
        order.professionals = [...professionalsInSameArea]
        return order;
      });
      res.render('booking-information', {title: 'Technician', orders: orders, user: req.user});
    })
      .catch((err) => {
        console.error(err);
      });
});

我想筛选出在同一地区和提供相同服务的专业人员,以便针对他们所从事的服务下订单。

你想查询模型吗?orders是什么,它是结果吗?请发布一个最小、完整、可验证的示例。 - Aritra Chakraborty
我已经添加了完整的代码。 - Harinarayan
有人能帮我解决这个问题吗:我该如何在这一行中应用:return (professional.service === order.service || professional.secondary_service LIKE '%' + order.service + '%') && (professional.area === order.area || order.area === professional.secondary_area); 这是真还是假? - Harinarayan
2个回答

4
you can use Op operator in query
like :-

const Op = Sequelize.Op

{
  [Op.or]: [
    {
      fieldName: {
        [Op.like]: 'abc%'
      }
    },
    {
      fieldName: {
        [Op.like]: '%abc%'
      }
    }
  ]
}

如何在此行中应用:return (professional.service === order.service || professional.secondary_service LIKE '%' + order.service + '%') && (professional.area === order.area || order.area === professional.secondary_area); - Harinarayan

3
相信或不相信,你可以在你的情况下只使用String.indexOf函数。因为根据定义,String LIKE %word%意味着如果String包含word
router.get('/booking-information', function (req, res) {
  // Get orders
  Promise.all([
    Order.findAll({
      /*where: {
        endDate: null,
      },*/
      order: [
        ['id', 'DESC'],
      ]
    }),
    Professional.findAll({
      where: {
        status: '1'
      }
    })
  ])
    .then(([orders, professionals]) => {
      orders.map((order) => {
        let professionalsInSameArea = professionals.filter((professional) => {
          return (professional.service === order.service 
                 || (professional.secondary_service || '').toLowerCase().indexOf((order.service || '').toLowerCase()) > -1) 
            && (professional.area === order.area 
                || order.area === professional.secondary_area);
        });
        order.professionals = professionalsInSameArea; //you don't need to spread, then make an array
        return order;
      });
      res.render('booking-information', { title: 'Technician', orders: orders, user: req.user });
    })
    .catch((err) => {
      console.error(err);
    });
});

谢谢您的回复,但是它显示错误:TypeError: Cannot read property 'toLowerCase' of null @Aritra - Harinarayan
是的,您也必须处理空值,具体取决于数据。我只是向您展示了在最佳情况下如何处理它们。 - Aritra Chakraborty
暂时处理了空值。 - Aritra Chakraborty

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接