水线ORM等效于重复密钥更新时的插入

iop*_*opq 4 sql orm node.js sails.js waterline

我有一个表user_address,它有一些字段,如

attributes: {
  user_id: 'integer',
  address: 'string' //etc.
}
Run Code Online (Sandbox Code Playgroud)

目前我这样做是为了插入新记录,但如果该记录存​​在,请更新它:

UserAddress
  .query(
    'INSERT INTO user_address (user_id, address) VALUES (?, ?) ' +
      'ON DUPLICATE KEY UPDATE address=VALUES(address);',
    params,
    function(err) {
       //error handling logic if err exists
    }
Run Code Online (Sandbox Code Playgroud)

有没有办法使用Waterline ORM而不是直接的SQL查询来实现同样的目的?我不想做两个查询,因为它效率低,难以维护.

Eug*_*ene 7

上面的答案不太理想.它还将该方法作为模型属性的一部分,这是不正确的行为.

以下是理想的原生解决方案看起来像任何其他水线模型函数将返回一个承诺:

module.exports = {
  attributes: {
    user_id: 'integer',
    address: 'string'
  },
  updateOrCreate: function (user_id, address) {
    return UserAddress.findOne().where({user_id: user_id}).then(function (ua) {
      if (ua) {
        return UserAddress.update({user_id: user_id}, {address: address});
      } else {
        // UserAddress does not exist. Create.
        return UserAddress.create({user_id: user_id, address: address});
      }
    });
  }
}
Run Code Online (Sandbox Code Playgroud)

然后你就可以像以下一样使用它:

UserAddress.updateOrCreate(id, address).then(function(ua) {
   // ... success logic here
}).catch(function(e) {
   // ... error handling here
});
Run Code Online (Sandbox Code Playgroud)