首页 > 解决方案 > Sequelize 多对多关系过滤

问题描述

我有 2 个具有多对多关系 ( JobPost, Skill) 的模型,我想在其中搜索所有JobSkill包含特定Skill. 到目前为止,我已经有了以下内容,

招聘岗位型号:

 static associate(models) {
   this.belongsTo(models.User, { foreignKey: 'authorId', as: 'author' });
   this.belongsToMany(models.Skill, { through: models.Job_Skill, foreignKey: 'jobPostId', otherKey: 'skillId', as: 'skills' });
   this.belongsToMany(models.JobCategory, { through: models.JobPost_Category, foreignKey: 'jobPostId', otherKey: 'jobCategoryId', as: 'categories' });
   this.belongsToMany(models.User, { through: models.JobPostSubscription, foreignKey: 'jobPostId', otherKey: 'userId', as: 'subscriptions' });
 }
};
JobPost.init({
 authorId: {
   type: DataTypes.INTEGER,
   allowNull: false
 },
 title: {
   type: DataTypes.STRING,
   allowNull: false
 },
 body: {
   type: DataTypes.TEXT
 },
 budget: {
   type: DataTypes.FLOAT,
   defaultValue: 0,
   validate: {
     min: 0
   }
 },
 location: {
   type: DataTypes.STRING
 },
 private: {
   type: DataTypes.BOOLEAN,
   defaultValue: false
 },
 deadline: {
   type: DataTypes.DATE
 },
 status: {
   type: DataTypes.ENUM(enumJobStatuses),
   defaultValue: enumJobStatuses[0]
 }
}, {
 sequelize,
 modelName: 'JobPost',
});

技能模型:

class Skill extends Model {
    static associate(models) {
      this.Users = this.belongsToMany(models.User, { through: models.User_Skill, foreignKey: 'skillId' });
    }
  };
  Skill.init({
    title: DataTypes.STRING
  }, {
    sequelize,
    modelName: 'Skill',
  });

Job_Skill 模型:

class Job_Skill extends Model {
    static associate(models) {
    }
  };
  Job_Skill.init({
    jobPostId: {
      type: DataTypes.INTEGER,
      primaryKey: true
    },
    skillId: {
      type: DataTypes.INTEGER,
      primaryKey: true
    }
  }, {
    sequelize,
    modelName: 'Job_Skill',
    timestamps: false
  });

主要代码:

models.JobPost.findAll({
   include: {
        model: models.Skill,
        as: 'skills',
        attributes: ['id', 'title'],
        through: { where: { skillId: req.query.skillId } }
    }
})

但这会返回所有帖子。我尝试使用{ where: { '$skills.id$': req.query.skillId } }which 返回JobPost只有一个Skill与 SkillId 匹配的 s。我希望JobPosts 返回该帖子的任何技能与 SkillId 匹配的位置。因此,如果一个帖子有 2 个技能,并且给定的技能与其中一个技能匹配,它将出现在结果中。

标签: javascriptnode.jssequelize.js

解决方案


我认为问题可能只存在于 where 语句中。我做了类似的事情:

skillId: { [Sequelize.Op.in]: skillsList }

考虑到您在skillsList.


推荐阅读