我是Sequelize和ORM概念的初学者。我已成功将查询转换为Sequelize findAll()函数,但它返回了不需要的结果。 PostgreSQL查询可以正常工作并返回结果。
具有关系的表:
我的查询:
SELECT writers."writerName", posts."postTitle", posts."postDescription",
skillmatrix.*
FROM writers
INNER JOIN skillmatrix
ON writers."writerId" = skillmatrix."writerId"
INNER JOIN posts
ON skillmatrix."postId" = posts."postId"
ORDER BY writers."writerId", posts."postId"
SQL查询的输出:
续集的关系:
db.skillmatrix.hasMany(db.posts,{foreignKey: 'postId'});
db.skillmatrix.hasMany(db.writers,{foreignKey: 'writerId'});
Sequelize中的findAll()方法:
exports.findAll = (req, res, next) => {
SkillMatrix.findAll({
include: [
{
model: Writer,
required: true
},
{
model: Post,
required: true
}
],
order:[
['"writerId"', 'ASC'],
['"postId"', 'ASC']
]
})
.then(skillmatrix => {
res.status(200).json(skillmatrix);
})
.catch(err => {
console.log(err);
res.status(500).json({msg: "error", details: err});
});
};
Sequelize的JSON输出:
{
"skillMatrixId": 1,
"writerId": 1,
"postId": 1,
"writerSkill": "None",
"writers": [
{
"writerId": 1,
"writerName": "Writer1"
}
],
"posts": [
{
"postId": 1,
"postTitle": "Post1"
"postDescription": "This is Post1"
}
]
},
{
"skillMatrixId": 2,
"writerId": 1,
"postId": 2,
"writerSkill": "SEO",
"writers": [
{
"writerId": 2,
"writerName": "Writer2" //This is unexpected
}
],
"posts": [
{
"postId": 2,
"postTitle": "Post2",
"postDescription": "This is Post2"
}
]
},
{
"skillMatrixId": 3
"writerId": 1,
"postId": 3,
"writerSkill": "Proofread"
"writers": [
{
"writerId": 3, //Unexpected
"writerName": "Writer3"
}
],
"posts": [
{
"postId": 3,
"postTitle": "Post3",
"postDescription": "This is Post3"
}
]
}...
请让我知道,我在做什么错。还建议我一些好的资源,以便我可以深入学习。谢谢。
编辑:
序列化日志查询:
SELECT "skillmatrix"."skillMatrixId",
"skillmatrix"."writerId", "skillmatrix"."postId",
"skillmatrix"."writerSkill",
"writers"."writerId" AS "writers"."writerId",
"writers"."writerName" AS "writers"."writerName",
"posts"."postId" AS "posts"."postId",
"posts"."postTitle" AS "posts"."postTitle",
"posts"."postDescription" AS "posts"."postDescription",
"posts"."writerId" AS "posts"."writerId"
FROM "skillmatrix" AS "skillmatrix"
INNER JOIN "writers" AS "writers" ON "skillmatrix"."skillMatrixId" =
"writers"."writerId"
INNER JOIN "posts" AS "posts" ON "skillmatrix"."skillMatrixId" =
"posts"."postId"
ORDER BY "skillmatrix"."writerId" ASC, "skillmatrix"."postId" ASC
答案 0 :(得分:1)
首先,您应该检查序列化日志-findAll生成什么查询?我猜想它加入了一个错误的领域。
Sequelize对于多对多关系有一些选择。您可以尝试:
"
我正在近似语法-在文档belongsToMany
中进行检查编辑-您现有的关联可以如下固定:
db.posts.belongsToMany (db.writers, {as : 'p2w', through: db.skillMatrix, foreignKey: 'postId' });
db.writers.belongsToMany(db.posts, {as : 'w2p', through: db.skillMatrix, foreignKey: 'writerId' });
db.posts.findAll({
include: {
model: db.writers,
as: 'p2w',
required: true
}
});
但是,请记住,以后执行任务的M:M选项:)
答案 1 :(得分:1)
从更新更新Sequelize关系:
db.skillmatrix.hasMany(db.posts,{foreignKey: 'postId'});
db.skillmatrix.hasMany(db.writers,{foreignKey: 'writerId'});
收件人:
db.skillmatrix.hasMany(db.posts,{sourceKey: 'postId' , foreignKey: 'postId'});
db.skillmatrix.hasMany(db.writers,{sourceKey: 'writerId' ,foreignKey: 'writerId'});