Sails.js Waterline更新:如何处理多个更新

3

我有一个对象数组需要更新,因此需要多次更新。我正在寻找最佳实现方法。每个对象包含相同的属性,但是每个对象的属性具有不同的值。

我该如何实现呢?

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) {
    // ...
    // ...
});

如果我像上面的代码那样做,它会具体做什么?它会自动尝试匹配people数组中每个记录的主键,更新列出的任何属性,然后将更新的记录传递到回调函数中吗?
我在Sails.js文档这里中注意到update函数的第二个参数可以是一个对象或一个数组,但我不确定我能否像这样使用。文档不清楚。
如果我不能像这样使用,并且我想尝试迭代或递归方法,你会建议我如何实现呢?

我认为你应该尝试:var people = [ {'firstName': 'Brian'}, {'firstName': 'Taylor'}, {'firstName': 'Jake'} ]; - Ahmed farag mostafa
1个回答

1

你的适配器是什么?

我必须在MySQL中执行此操作,我自己进行查询my self,然后调用PersonModel.query(myQuery)

我按照this answer的方法进行操作(例如使用两个字段的示例):

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

输出:

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

MySQL适配器。所以你循环遍历对象数组并在每次迭代中更新查询字符串?然后你只需执行一个查询?看起来我们可能已经找到了一个解决方案。我们创建了一个递归函数,似乎可以做到我们需要的事情。但是,如果你希望我考虑你的答案,请详细说明。 - Brian
1
递归调用不是一个好主意,它不能进行超过256次的迭代... 我使用了这个来发出请求。 - M-A. Fernandes
经过研究,我认为这是一种非常好的实现方式。谢谢!唯一建议的是让答案更清晰明了,以便任何人都能理解。 - Brian
1
@Brian 谢谢,我刚刚编辑了答案并加入了一个例子。希望现在更清晰一些。 - M-A. Fernandes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接