2017-02-23 13 views
2

を更新します)Sequelizeは、私は次のコードを使用してSequelizeでモデルを更新しようとしている

項目がmodels.TimeSheetItem.findを(やった結果である
exports.updateItem = function(item) { 
    return new Promise((fulfill, reject) => { 
     models.TimesheetItem.update(item,{where: {id: item.id}}) 
          .then(fulfill) 
          .catch(console.dir); 
    }); 
}; 

を呼び出しが実行されることはありませんその後、空のオブジェクトを.catchに渡します。

私はドキュメントを見てきましたが、これは行を更新する方法だと思われますが、動作させることはできません。私は間違って何をしていますか?

ありがとうございました!最初の更新を実行するために使用されるvaluesであり、2つ目は、optionsある - - ので、あなたの場合、これはwhere句である

答えて

4

ドキュメントによればupdate方法は、2つのパラメータを取ります。単一のインスタンスに対してのみ更新を実行する場合は、where句に一致するこのモデルの複数のインスタンスを一度に更新できるModel.update()メソッドを使用するか、単一のインスタンスのみを更新するためにinstance.update()を実行する2つの方法で行うことができますインスタンス。最初のオプションは次のようになります。

let updateValues = { name: 'changed name' }; 
models.Model.update(updateValues, { where: { id: 1 } }).then((result) => { 
    // here your result is simply an array with number of affected rows 
    console.log(result); 
    // [ 1 ] 
}); 

最初のオプションは、1つのインスタンスのみを更新する場合にはあまり役に立ちません。 itemパラメータがSequelizeモデルインスタンス(ないのJavaScript JSONオブジェクトプレーン)であれば、あなたのケースでSequelizeモデルインスタンス

let updateValues = { name: 'changed name' }; 
instance.update(updateValues).then((self) => { 
    // here self is your instance, but updated 
}); 

update()を実行する可能性があるだから、なぜ、あなたの更新機能でありますitemは、更新したい値を持つsequelizeモデルインスタンスだけのプレーンオブジェクトでない場合は、しかし、その

exports.updateItem = function(item){ 
    return item.update(values).then((self) => { 
     return self; 
    }).catch(e => { 
     console.log(e); 
    }); 
}; 

ようなことができ、二つの方法で行うことができる - 最初を使用することです(あなたがやったように)、またはもう一つはid = item.idTimesheetItemを取得し、

exports.updateItem = function(item){ 
    models.TimesheetItem.update(item, { where: { id: item.id } }).then((result) => { 
     // here result will be [ 1 ], if the id column is unique in your table 
     // the problem is that you can't return updated instance, you would have to retrieve it from database once again 
     return result; 
    }).catch(e => { 
     console.log(e); 
    }); 
}; 

またはインスタンスを返すと、その上にアップデートを実行して第二の選択肢の上に示すように、instance.update()を実行することである

exports.updateItem = function(item) { 
    return models.TimesheetItem.findById(item.id).then((itemInstance) => { 
     return itemIstance.update(item).then((self) => { 
      return self; 
     }); 
    }).catch(e => { 
     console.log(e); 
    }); 
} 

違いは、Promiseを作成して返す必要はないということです。update()返品約束などの方法を続けることができます。

+0

素敵な答え、あなたはそれを完全に説明しました。 多くの感謝! – troyz

関連する問題