2016-06-20 10 views
1

So habe ich seit ein paar Stunden mit einem Eins-zu-viele-Mapping-Update gekämpft.eins zu viele - Fortsetzung Update - Kinder nicht entfernen/einfügen

Ich habe eine project, die bestimmte tasks (zum Beispiel) hat. Ich füge Aufgaben hinzu und entferne sie über das Frontend und sende das überarbeitete Objekt an das Backend, das mit sequelize läuft.

Dann habe ich versucht, die Datensätze zu aktualisieren, wie folgt:

return models.Project 
    .findOne({ 
     where: { id: projectToUpdate.id }, 
     include: [models.Task] 
    }) 
    .then(function (ProjectFromDb) { 
     return models.sequelize 
      .transaction({ 
       isolationLevel: models.sequelize.Transaction.ISOLATION_LEVELS.READ_COMMITTED 
      }, 
      function (t) { 
       return ProjectFromDb 
        .update(projectToUpdate, 
        { 
         include: [{ model: models.Task }] 
        }) 
       }); 
    }) 
    .then(function (result) { 
     return output.getSuccessResult(.... 
    }) 
    .catch(function (error) { 
     return output.getErrorResult(.... 
    }); 

Dies würde aber nur die Project

Nächstes Update Ich habe versucht, sie mit einem zusätzlichen then Aufruf zu aktualisieren:

.then(function (updateResult) { 
     return updateResult.setTasks(projectToUpdate.Tasks, {transaction: t}) 
    }) 

Aber das würde mir das Ergebnis geben, dass er versucht, die Task zu aktualisieren und dieeinzustellenbis NULL, was nicht möglich ist, weil es nicht nullfähig ist.

Ich bin derzeit "manuell" Hinzufügen der tasks und Entfernen von ihnen, aber das scheint eine alberne Art der Verwendung des Rahmens sein.

Kann mir jemand sagen, wie man das mit einer Eins-zu-Viele-Beziehung richtig macht, ohne dass ich Tasks.createBulk und Tasks.destroy anrufe?

EDIT EINZUBEZIEHEN MODEL JSON-Objekt wie folgt aussieht:

{ 
    id: 1, 
    projectName: 'nameOfTheProject', 
    Tasks: [ 
     projectId: 1, 
     name: 'taskName' 
    ] 
} 
+0

Können Sie uns zu diesem Zeitpunkt den Inhalt von 'projectToUpdate' zeigen? Ist es ein Sequelize-Modell oder nur ein gewöhnliches JS-Objekt? Danke – demarchisd

+0

Es ist ein JSON-Objekt aus dem Front-End. Nichts mehr. {'name:" somename ", Aufgaben: [..sometasks ..]}' (das ist natürlich vereinfacht) – Tikkes

+0

Richtig, und was ist das Format der Objekte in der 'Aufgaben' Liste? Haben sie ein Attribut 'ProjectId'? Sorry für den Missbrauch, aber es wäre nett, wenn Sie Ihre Frage mit einer legitimen JSON-Darstellung Ihres 'projectToUpdate' zur Laufzeit bearbeiten könnten – demarchisd

Antwort

1

Bitte versuchen Sie die Eigenschaftsnamen projectId-ProjectId auf Tasks Objekte zu ändern, das das projectToUpdate Objekt verschachtelt sind.


aktualisieren

Looking at sequelize's source, so scheint es, dass die Instance.$save() Funktion (die von Instance.$update() aufgerufen wird, die Sie verwenden) nicht verschachtelte Modelle Schöpfung nicht unterstützt, wenn Sie es zu aktualisieren - es überprüft, ob das Flag wasNewRecordtrue ist, bevor Sie es tun.

+0

Das macht keinen Sinn, denn Mein Fremdschlüssel ist projectId (non capital). Jedenfalls habe ich es versucht und es hat nicht funktioniert. – Tikkes

+0

Die Tabellen wurden von Sequelize erstellt? Oder du hast sie gerade kartiert? Weil all die Male, die ich Sequelize verwendete, der FK mit TitleCase standardmäßig erstellt wurde. Haben Sie versucht mit dem zusätzlichen 'then' Anruf? '.dann (function (updateResult)) { return updateResult.setTasks (projectToUpdate.Tasks, {transaction: t}) }) – demarchisd

+0

in diesem Fall bekomme ich folgenden Fehler: 'val.replace ist keine Funktion' – Tikkes