2016-04-26 7 views
3

Ich habe ein Array von Objekten, die ich aktualisieren möchte, also ein mehrfaches Update. Ich suche nach dem besten Weg, dies zu implementieren. Jedes Objekt enthält die gleichen Eigenschaften, aber die Eigenschaften für jedes Objekt haben unterschiedliche Werte.Sails.js Waterline UPDATE: Wie man mehrere Updates behandelt

Implementiere ich so etwas?

var people = [ 
    {'firstName': 'Brian', 'clockedIn': '2016-4-12', 'type': 'developer'}, 
    {'firstName': 'Taylor', 'clockedIn': '2016-4-14', 'type': 'developer'}, 
    {'firstName': 'Jake', 'clockedIn': '2016-4-14', 'type': 'manager'} 
]; 

PersonModel.update({'type': 'developer'}, people, function(err, records) { 
    // ... 
    // ... 
}); 

Wenn ich etwas wie den vorherigen Code mache, was genau tut es? Wird automatisch versucht, den Primärschlüssel jedes Datensatzes im People-Array abzugleichen, eine der aufgelisteten Eigenschaften zu aktualisieren und die Datensätze, die aktualisiert wurden, an die Callback-Funktion zu übergeben?

Ich bemerkte in der Sails.js Dokumentation here, dass das zweite Argument für die Update-Funktion ein Objekt oder ein Array sein kann, ich bin nur unklar, ob ich es so verwenden kann. Die Dokumentation ist unklar.

Wenn ich es nicht so verwenden kann und ich einen iterativen oder rekursiven Ansatz versuchen wollte, wie würden Sie vorschlagen, dass ich es implementiere?

+0

ich glaube, Sie sollten versuchen: var Menschen = [ { 'firstNa ich ':' Brian '}, {' Vorname ':' Taylor '}, {' Vorname ':' Jake '} ]; –

+0

ummmmmmmmm, nicht wahr? – Brian

Antwort

2

Was ist Ihr Adapter?

Ich hatte dies mit MySQL zu tun, ich die Abfrage my self machen und rufe dann PersonModel.query(myQuery)

I this answer folgen (Beispiel mit zwei Feld) zu machen:

values = [ 
    { 
     id: 1, 
     param_1: 'NewValueParam1', 
     param_2: 'NewValueParam2' 
    }, 
    { 
     id: 2, 
     param_1: 'AnotherNewValueParam1', 
     param_2: 'AnotherNewValueParam2' 
    } 
]; 

function multiValuesUpdate(values) { 
    var request = "UPDATE MyTable SET "; 
    var part_param_1 = "`param_1` = (CASE `id` "; 
    var part_param_2 = "`param_2` = (CASE `id` "; 
    var part_ids = "WHERE `id` IN ("; 

    _.forEach(values, function (v) { 
     part_param_1 += "WHEN '" + v.id + "' THEN '" + v.param_1 + "' "; 
     part_param_2 += "WHEN '" + v.id + "' THEN '" + v.param_2 + "' "; 
     part_ids += v.id + ","; 
    }); 
    part_param_1 += "ELSE `param_1` END), "; // Be careful with the comma ! 
    part_param_2 += "ELSE `param_2` END) "; 
    part_ids = part_ids.slice(0, -1) + ");"; // Remove the last "," and add ");" 

    request += part_param_1 + part_param_2 + part_ids; 
    return request; 
} 

console.log(multiValuesUpdate(values)); 

Ausgang:

"UPDATE MyTable 
    SET `param_1` = (
    CASE `id` 
     WHEN '1' THEN 'NewValueParam1' 
     WHEN '2' THEN 'AnotherNewValueParam1' 
     ELSE `param_1` 
    END), 
    `param_2` = (
    CASE `id` 
     WHEN '1' THEN 'NewValueParam2' 
     WHEN '2' THEN 'AnotherNewValueParam2' 
     ELSE `param_2` 
    END) 
WHERE `id` IN (1,2);" 
+0

Mysql-Adapter. Sie durchlaufen also Ihr Array von Objekten und aktualisieren die Abfragezeichenfolge bei jeder Iteration? Dann führst du einfach eine Abfrage aus? Es sieht so aus, als hätten wir eine Lösung gefunden. Wir haben eine rekursive Funktion geschaffen, die zu tun scheint, was wir tun müssen. Bitte erläutern Sie jedoch Ihre Antwort, wenn Sie möchten, dass ich darüber nachdenke. – Brian

+1

Der rekursive Aufruf ist keine gute Idee, es kann nicht mehr als 256 Iteration machen ... Ich habe [das] (http://stackoverflow.com/questions/20255138/sql-update-multiple-records-in- One-Query), um die Anfrage zu stellen. –

+0

Wenn ich mir das anschaue, denke ich, dass es ein ziemlich guter Weg ist, es zu implementieren. Vielen Dank! Das einzige, was ich vorschlagen würde, ist, die Antwort für jeden klarzustellen und zu erläutern, der darüber stolpert. – Brian