如何使用节点Sequelize正确定义与现有联合表的一对多关系

时间:2013-11-04 04:59:54

标签: mysql sql node.js sequelize.js

我正在使用Sequelize,但由于我还有其他服务器运行而不是node.js,我需要让他们共享数据库。因此,在定义一对多关系时,我需要让Sequelize使用旧的现有jointTable。

我将关联的定义写成如下,其中pidpresentations的主键:

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的引用,这会导致此问题。

所以我想知道如何正确设置联结表,以便他们中的两个可以正确使用外键。

2 个答案:

答案 0 :(得分:0)

jointTableName : 'course_presentations'

应该是(没有t)

joinTableName : 'course_presentations'

答案 1 :(得分:0)

实际上AFAIK--这种关系不是纯粹的"一个对多

你有一门课程可以在course_presenation表中有很多条目,而course_presentation与演示文稿有一对一的关系。如果是这样,只需在模型中定义那种关联。