2017-01-09 14 views
0

これは私のモデルである:Sequelizeで連想テーブルのデータを更新するための作業例?

以下

var Vote = sequelize.define('vote', { 
 
    title: { 
 
     type: Sequelize.STRING, 
 
     allowNull: false 
 
    }, 
 
    description: { 
 
     type: Sequelize.TEXT 
 
    } 
 
}); 
 

 
var Choice = sequelize.define('choice', { 
 
    choiceTitle: { 
 
     type: Sequelize.STRING, 
 
     allowNull: false 
 
    }, 
 
    count: { 
 
     type: Sequelize.INTEGER, 
 
     length: 6 
 
    } 
 
}); 
 
Choice.belongsTo(Vote); 
 
Vote.hasMany(Choice, {onUpdate: 'cascade'});

は、可能な場合の「投票」引数を使用して、関連の「選択肢」テーブルを含むの投票 'テーブルを更新するためのコードである「(ストア)」これはすでに、アプリからの「選択肢」を含む更新された値を持つ投票の対象です。

store(vote, callback) { 
 
    return Vote.findById(vote.id, { 
 
     include: [ 
 
      { 
 
       model: Choice, 
 
       as: 'choices' 
 
      } 
 
     ] 
 
    }).then(function(resVote) { 
 
     resVote.choices[0].updateAttributes({count: 120}) // just to test if at least it gets written to db 
 
      .then(function(res) { 
 
       callback(null, res); 
 
      }).catch((err) => callback(err, null)); 
 
    }); 
 
},

FYI:私はちょうどそれが動作しますが、万歳、それはPostgresの-DBにダウン書き込まれます場合は、単に確認するために、120に特定の選択肢の一つの属性を設定し、コードで(Jan Aagaardの返信のおかげで、少なくともUpdating attributes in associated models using Sequelizeに関連するテーブルの更新があります)。

私はSequelizeのドキュメントでは解決策を見つけられませんでした(少なくともいくつかはあります)。 'save()'、 'update()'または 'upsert()'を直接試みると、nullが許可されている場合は空のフィールドを持つまったく新しい行が作成され、nullが許可されない場合は失敗します。

テーブルのすべての(変更された)フィールドを更新するため、また可能であればSequelizeの関連テーブルを更新するには、どのような方法が推奨されますか?申し訳ありませんが、この質問は少し基本的ですが、私は今すぐに固執しており、このタスクの明確な答えが見つかりませんでした。

答えて

1

include objを渡すことができます(http://sequelize.readthedocs.io/en/v3/docs/associations/の「関連付けを使って作成する」を参照)。しかし、更新ではそうではありません。

は、私はあなたが関係を使用して、関連レコードをフェッチされて何をしたいのかを考えるSequelizeはあなたを提供し、それらのインスタンスを更新アクセサ:

Vote.findById(vote.id) 
    .then(function(vote) { 
    return vote.getChoices() 
    }) 
    .then(function(choices) { 
    return choices[0].update({ count: 120 }) 
    }) 
    .then(function(choice) { 
    callback(null, choice); 
    }) 
    .catch(function(err) { 
    callback(err); 
    }); 

    (I realise this means you lose the join and end up with two separate queries, but I can't think another way of doing this just now) 
+0

ありがとう、それが機能するようになりました。これは私に正しい方向を指摘しましたが、私はまだ投票の対象から正しい選択を得るのに苦労していますが、少なくとも今はさらに進んでいます。私がこれまでの実例を持っていれば、これを更新しておきます。 –

+0

ようこそ。 –

+0

私はそれをそのまま残しています。なぜなら、現在MongoDBをバックエンドとして使用しているからです。ネストされた要素を持つ文書をdbに取得するほうがずっと簡単です。それはHeroku上で無料ですので、postgresを使用してください。しかし、mongoDBを無料で提供していることがわかりました;-) –

関連する問題