我正在使用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数组中返回许多图像记录。
恐怕我正在努力理解通过联接表获取的语法,并且希望有人可以指出我的出路。
答案 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
}
})