0

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つが外部キーを正しく使用できるようにする方法を考えています。

4

2 に答える 2

0

実際には、この種の関係は「純粋な」1対多ではありません。

1 つのコースが course_presenation テーブルに多くのエントリを持つことができ、course_presentation はプレゼンテーションと 1 対 1 の関係にあります。もしそうなら、モデルでそのような関連付けを定義するだけです。

于 2016-05-20T13:39:29.520 に答える