为了账号安全,请及时绑定邮箱和手机立即绑定

如何将单个 SQL OR 运算符应用于续集中的表及其关联表?

如何将单个 SQL OR 运算符应用于续集中的表及其关联表?

慕妹3242003 2022-09-29 15:22:06
我想查找其中包含特定子字符串的产品(搜索产品),即搜索字符串匹配或或{在其他关联表( OR) 中} 或其他关联(hasMany)表( ),即,如果所有SKU的描述中的任何位置}product.nameproduct.descriptioncategory.namecategory.descriptionsku.description我有一个具有以下结构的表格products具有字段的字段与具有字段的字段id | name | description | categoryIdcategoriesid | name | descriptionskuid | productId | description有关系db.product.belongsTo(db.category);db.category.hasMany(db.product);db.sku.belongsTo(db.product);db.product.hasMany(db.sku);最终,我想要搜索字符串与产品的任何位置匹配的产品。db.product.findAll({   include: [      {         // hasOne relation         model: db.category,      },      {         // hasMany relation         model: db.sku,      },   ],   where: {      [Op.or]: [         {            name: {               [Op.like]: `%${search}%`            }         },         {            description: {               [Op.like]: `%${search}%`            }         },         // this doesn't work need some way to achieve something like this         // {         //    category:{         //       name: {         //          [Op.like]: `%${search}%`         //       }         //       description: {         //          [Op.like]: `%${search}%`         //       }         //    }         // }      ]   }})我可以在 部分内应用条件,但这不会像整体或那样像我需要的搜索一样工作。whereincludecategory这不会给出预期的结果   include: [      {         model: db.category,         where : {            name: {                [Op.like]: `%${search}%`            }            description: {                [Op.like]: `%${search}%`            }         }      }   ],
查看完整描述

1 回答

?
慕姐8265434

TA贡献1813条经验 获得超2个赞

使用不开箱即用的联接表列的子句可以包装在 $中。


为了获取涉及嵌套列的顶级 WHERE 子句,Sequelize 提供了一种引用嵌套列的方法:“$nested.column$”语法。


例如,它可用于将 where 条件从包含的模型从 ON 条件移动到顶级 WHERE 子句。


User.findAll({

  where: {

    '$Instruments.size$': { [Op.ne]: 'small' }

  },

  include: [{

    model: Tool,

    as: 'Instruments'

  }]

});

在 SQL 中生成:


SELECT

  `user`.`id`,

  `user`.`name`,

  `Instruments`.`id` AS `Instruments.id`,

  `Instruments`.`name` AS `Instruments.name`,

  `Instruments`.`size` AS `Instruments.size`,

  `Instruments`.`userId` AS `Instruments.userId`

FROM `users` AS `user`

LEFT OUTER JOIN `tools` AS `Instruments` ON

  `user`.`id` = `Instruments`.`userId`

WHERE `Instruments`.`size` != 'small';

有关文档,您可以在此处阅读:https://sequelize.org/master/manual/eager-loading.html


查看完整回答
反对 回复 2022-09-29
  • 1 回答
  • 0 关注
  • 51 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信