我正在使用Sequelize,但由于我还有其他服务器运行而不是node.js,我需要让他们共享数据库。因此,在定义一对多关系时,我需要让Sequelize使用旧的现有jointTable。
我将关联的定义写成如下,其中pid
是presentations
的主键:
this.courses.hasMany(this.presentations,
{as : 'Presentations',
foreignKey : 'cid',
joinTableName : 'course_presentations'
});
或者这个:
this.courses.hasMany(this.presentations,
{as : 'Presentations',
foreignKey : 'pid',
joinTableName : 'course_presentations'
});
我使用以下代码检索相关的演示文稿:
app.get('/courses/presentations/:cid', function (req, res){
var cid = req.params.cid;
app.models.courses.find({where: {cid:cid}}).success(function(course){
course.getPresentations().success(function(presentations){
res.send(presentations);
});
});
});
前一个会告诉我there is no cid in 'presentations' table
。
后者会给出这样的东西:
Executing: SELECT * FROM `courses`;
Executing: SELECT * FROM `courses` WHERE `courses`.`cid`='11' LIMIT 1;
Executing: SELECT * FROM `presentations` WHERE `presentations`.`pid`=11;
仔细检查,我发现每次都会使用cid
值来查询presentations
,这意味着只有当它们碰巧共享相同的id值时,才会返回一些内容。甚至对于那些人来说,这是不正确的。
我强烈怀疑,Sequelize没有使用我指定的joinTable,相反,它仍然试图在原来的两个表中找到外键。它正在查看pid
作为演示文稿中cid
的引用,这会导致此问题。
所以我想知道如何正确设置联结表,以便他们中的两个可以正确使用外键。
答案 0 :(得分:0)
jointTableName : 'course_presentations'
应该是(没有t)
joinTableName : 'course_presentations'
答案 1 :(得分:0)
实际上AFAIK--这种关系不是纯粹的"一个对多
你有一门课程可以在course_presenation表中有很多条目,而course_presentation与演示文稿有一对一的关系。如果是这样,只需在模型中定义那种关联。