【问题标题】:Sequelize Include with Where ConditionSequelize Include with Where 条件
【发布时间】:2019-10-24 13:38:53
【问题描述】:

我在如何使用 where 条件查询多个包含时遇到问题。

使用直接查询 sql 进行了尝试,它工作正常。我使用 sql 制作了一个示例,但在使用 sequelize 查询将其转换为 node.js 时遇到问题。

这是正确的 SQL

SELECT pr.id, pr.component_id, pr.requirement_type_id, c.name, rt.name
FROM product_requirements as pr
LEFT JOIN components as c
ON pr.component_id = c.id
LEFT JOIN requirement_types as rt
ON pr.requirement_type_id = rt.id
WHERE c.name LIKE '%Product%'
OR rt.name LIKE '%Product%';

我尝试将其转换为 sequelize,这是我迄今为止所做的,但它不断收到错误或正确的结果

let query = {
    where : {
        [Op.or] : [
            {component.name : { [Op.like] : `%${keyword}%` }},
            {requirement.name : { [Op.like] : `%${keyword}%` }}
        ]
    },
    include : [
        {
            model : models.components,
            as : 'component'
        },
        {
            model : models.requirement_types,
            as : 'requirement'
        }
    ]
}

我希望它会像 sql 结果一样

【问题讨论】:

    标签: sql node.js sequelize.js


    【解决方案1】:

    我认为 where 的查询不理解 alias

    var where = {
        [Op.or]: [
            sequelize.literal(`[components].name like "%${keyword}%"`),
            sequelize.literal(`[requirement_types].name like "%${keyword}%"`)
        ]
    };
    var include = [
        {
            model: models.components,
            as: 'component'
        },
        {
            model: models.requirement_types,
            as: 'requirement'
        }
    ];
    product_requirements.findAll({
        where: where,
        include: include
    
    }).then(results => {
    });
    

    【讨论】:

      【解决方案2】:

      发现我们需要添加required: false 才能使其工作并像这样编写代码。

      let where = {
          product_id : productId,
          [Op.or] : [
              {"$component.name$" : {[Op.like] : `%${keyword}%`}},
              {"$requirement_type.name$" : {[Op.like] : `%${keyword}%`}}
          ]
      }
      let include = [
          { model: models.components, required: false },
          { model: models.requirement_types, required: false }
      ]
      query = {
          where : where,
          include : include
      }
      
      models.product_requirements.findAll(query)
              .then((result) => {
                  res.status(200).send({
                      data : result
                  })
              })
              .catch((err) => {
                  res.error(err)
              })
      

      【讨论】:

        猜你喜欢
        • 2016-02-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-09-25
        • 2021-02-09
        • 2021-06-01
        • 2017-03-20
        • 2013-04-08
        相关资源
        最近更新 更多