在Nodejs / Express应用程序中使用Sequelize进行多对多查询

时间:2018-12-10 18:30:02

标签: mysql node.js sequelize.js

我正在使用MySQL和Sequelize构建Nodejs / Express后端,并且正在努力尝试通过关系查询的语法。

我有一个类别表,一个媒体(图像)表和一个联接表MediaCategory。我有一个包含类别ID的REST路由,我想获取该选定类别的所有媒体条目。

我定义了模型,并在app.js中定义了以下定义

Media.belongsToMany(Category, {
  through: {
    model: MediaCategory,
    unique: false
  },
  foreignKey: 'category_id',
  constraints: false
});

Category.belongsToMany(Media, {
  through: {
    model: MediaCategory,
    unique: false
  },
  foreignKey: 'media_id',
  constraints: false
});

我的getCategoryImages控制器方法是这样的:

exports.getCategoryImages = (req, res, next) => {
  const categoryID = req.params.category;
  console.log("const categoryID: ", categoryID);

  Category.findAll({
    include: [{
      model: Media,
      where: {
        id: categoryID
      }
    }]
  })
    .then(categoryImages => {
      if (!categoryImages) {
        const error = new Error('Could not find categoryImages.');
        error.statusCode = 404;
        throw error;
      }
      res
        .status(200)
        .json({
          message: 'Fetched category images successfully.',
          items: categoryImages,
        });
    })
    .catch(err => {
      if (!err.statusCode) {
        err.statusCode = 500;
      }
      next(err);
    });

};

我在邮递员中对URL localhost:8080 / categoryImages / 16的响应是这样的:

{
    "message": "Fetched category images successfully.",
    "items": []
}

应该在items数组中返回许多图像记录。

恐怕我正在努力理解通过联接表获取的语法,并且希望有人可以指出我的出路。

1 个答案:

答案 0 :(得分:0)

事实证明,问题在于我在app.js的两个关联定义中反转了外键

Media.belongsToMany(Category, {
  through: {
    model: MediaCategory,
    unique: false
  },
  foreignKey: '*media_id* not *category_id*',
  constraints: false
});

Category.belongsToMany(Media, {
  through: {
    model: MediaCategory,
    unique: false
  },
  foreignKey: '*category_id* not *media_id*',
  constraints: false
});

Media使用“ media_id”作为外键,Category使用“ category_id”,而不是像我最初尝试的那样。

同样,正如Emma在上面的评论中指出的那样,where: { id: categoryID }块需要在包含之外。

 Category.findAll({
    include: [{
      model: Media
    }],
    where: {
      id: categoryID
    }
  })