Sequelizeを使用していますが、node.js 以外のサーバーも実行しているため、それらにデータベースを共有させる必要があります。したがって、1 対多の関係を定義するときは、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 を使用しておらず、元の 2 つのテーブルで外部キーを見つけようとしているのではないかと強く疑っています。pid
プレゼンテーションでの参照として表示されているcid
ため、この問題が発生します。
したがって、ジャンクションテーブルを正しく設定して、2つが外部キーを正しく使用できるようにする方法を考えています。