sql >> データベース >  >> RDS >> Mysql

Sequelizeを使用した多対多関係の簡単な例

    移行

    続編の移行 を使用することをお勧めします 代わりにsync()を実行します 各モデルで。モジュールがあります- sequelize.cli これにより、移行とシードを簡単に管理できます。何らかの方法で、初期化ファイルindex.jsを作成してプロジェクト構造を強制します。 /models内 プロジェクトのディレクトリ。すべてのモデル定義がこのディレクトリにあることを前提としています。このスクリプトは、すべてのモデルファイルを繰り返し処理します(各モデル定義は、mentee.jsなどの個別のファイルにあります。 、question.js )そしてsequelize.import()を実行します これらのモデルをsequelizeインスタンスに割り当てるために、これにより、後でsequelize[modelName]を介してモデルにアクセスできます。 例えばsequelize.question

    注: 移行ファイルを作成するときは、タイムスタンプフィールドについて覚えておいてください-createdAtupdatedAt そして、最終的には、deletedAt

    同期

    個人的にはsync()を使用しています テストを実行した場合のみ-これは3つのステップで表示される場合があります

    1. sequelize.sync({ force: true })を実行します すべてのモデルを同期するために
    2. データベースのseedsを実行します (sequelize-cliからも実行できます )、
    3. テストを実行します。

    テストを実行する前にデータベースをクリーンアップできるため、これは非常に快適です。開発とテストを区別するために、テストでは異なるデータベースを使用できます。 project_test 、開発データベースがそのまま残るようにします。

    多対多

    次に、問題に移りましょう-2つのモデル間のm:n関係。まず、Promise.all()を実行するためです。 、sync 関数を追加するのとは異なる順序で実行できます。この状況を回避するには、mapSeriesを使用することをお勧めします Bluebirdの機能 Sequelizeが使用し、sequelize.Promiseで公開するpromise (これは、親行の削除に関する最後のエラーの理由でもあります-menteesを削除しようとしています これはmenteequestionから参照されます 。

    sequelize.Promise.mapSeries([
        Mentee.sync({ force: true })
      , Question.sync({ force: true })
      , MenteeQuestion.sync({ force: true })
    ], (model) => { return model.destroy({ where: {} }); }).then(() => {
    
    });
    

    mapSeriesの最初のパラメーター はpromiseの配列ですが、2番目の関数は、以前に定義された各promiseの結果を使用して実行される関数です。 Model.sync()という事実のため 結果はモデル自体になり、model.destroy()を実行できます 各反復で。

    その後、create()を使用してデータベースにデータを挿入できます。 、例のように。ここで、エラー:メンティーがメンティー質問に関連付けられていません!を修正します。 エラー。 Menteeを関連付けているために発生します Question ただし、MenteeQuestionの間に関連付けはありません およびMentee (またはQuestion )。これを修正するには、belongsToManyの後に 、追加できます

    MenteeQuestion.belongsTo(Mentee, { foreignKey: 'menteeId' });
    MenteeQuestion.belongsTo(Question, { foreignKey: 'questionId' });
    

    これで、include: [Mentee, Question]を追加できるようになりました MenteeQuestionをクエリするとき 。 toJSON()を実行しているときに、別のエラーが発生することもあります 、findAllを実行するため インスタンスの配列を返します。 forEach()を実行できます

    menteeQuestions.forEach(menteeQuestion => {
        console.log(menteeQuestion.toJSON());
    });
    



    1. Amazon Aurora、Amazon RDS、およびClusterControlのフェイルオーバー時間の比較

    2. ElasticBeanstalkがRDSパラメーターを作成しない

    3. sqliteが返されました:エラーコード=1、msg =そのような列はありません:kitchen1

    4. MySQL IS NOT NULLと!=''の違い