2017-02-23 2 views
2

Ich versuche, ein Modell in Sequelize mit dem folgenden Code zu aktualisieren:Sequelize Update

exports.updateItem = function(item) { 
    return new Promise((fulfill, reject) => { 
     models.TimesheetItem.update(item,{where: {id: item.id}}) 
          .then(fulfill) 
          .catch(console.dir); 
    }); 
}; 

Wo Artikel ist das Ergebnis models.TimeSheetItem.find tun()

Der Aufruf führt nie .und übergibt stattdessen ein leeres Objekt an das .catch.

Ich habe mir die Dokumentation angesehen und es scheint, dass dies der Weg ist, eine Zeile zu aktualisieren, aber ich kann es nicht zum Laufen bringen. Was mache ich falsch?

Vielen Dank!

Antwort

4

Nach der Dokumentation der update Methode hat zwei Parameter - erste values ist, die verwendet wird, um das Update durchzuführen, und das zweite ist options - so in Ihrem Fall ist dies die where Klausel. Wenn Sie nur eine einzelne Instanz aktualisieren möchten, können Sie dies auf zwei Arten tun: Verwenden Sie die Methode Model.update(), die mehrere Instanzen dieses Modells gleichzeitig mit der where-Klausel aktualisieren oder instance.update() ausführen kann, um nur die einzige Instanz zu aktualisieren Beispiel. Die erste Option sieht dann so aus:

Die erste Option ist nicht sehr nützlich, wenn Sie nur einzelne Instanzen aktualisieren möchten. Das ist also, warum eine Möglichkeit besteht, update() der Durchführung auf Sequelize Modellinstanz

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

In Ihrem Fall, wenn die item Parameter eine Sequelize Modellinstanz (nicht ein einfache JavaScript-JSON-Objekt) ist, Ihre Update-Funktion wie die jedoch

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

sein könnte, wenn die item keine sequelize Modellinstanz ist aber nur ein einfaches Objekt mit Werten, die Sie aktualisieren möchten, könnte es in zwei Arten erfolgen - erstenzu verwenden ist(genau wie Sie getan haben), oder zweite ist TimesheetItem mit id = item.id abzurufen und dann instance.update() ausführen, wie oben

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); 
    }); 
}; 

oder die zweite Option mit der Rückkehr Instanz und Durchführung Update auf sie

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); 
    }); 
} 
gezeigt

Der Unterschied ist, dass Sie keine eigenen Promise - Sequelize-Methoden wie update() Rückgabeversprechen selbst erstellen und zurückgeben müssen.

+0

Wunderbare Antwort, Sie haben es perfekt erklärt. Vielen Dank! – troyz