4

テーブル user_address があり、次のようなフィールドがいくつかあります

attributes: {
  user_id: 'integer',
  address: 'string' //etc.
}

現在、新しいレコードを挿入するためにこれを行っていますが、このユーザーにレコードが存在する場合は更新します。

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
    }

同じことを達成するために、ストレート SQL クエリの代わりに Waterline ORM を使用する方法はありますか? 非効率で維持が難しいため、2 つのクエリを実行したくありません。

4

3 に答える 3

4

@Eugeneの答えは良いですが、常に2つの操作を実行します: findOne+updateまたはcreate. レコードが存在する場合は実行するだけなので、さらに最適化できると思いますupdate。例:

module.exports = {
  attributes: {
    user_id: 'integer',
    address: 'string'
  },
  updateOrCreate: function (user_id, address) {
    return UserAddress.update({user_id: user_id}, {address: address})
    .then(function(ua){
      if(ua.length === 0){
        // No records updated, UserAddress does not exist. Create.
        return UserAddress.create({user_id: user_id, address: address});
      }
    });
  }
}

ところで、.updateOrCreateウォーターラインに実装するオープンリクエストがあります: #790

于 2015-06-04T00:06:50.243 に答える