在环回中使用远程方法增加模型中的字段?
Increment a field in model using remote method in loopback?
模型中有一个名为 counter 的字段,每当我调用
之类的自定义远程方法时
Request URL
http://loopback:3000/api/models/increment_counter
Request body
EMPTY
Response
{
"counter" : [Value after Increment]
}
目前要增加首先我必须从数据库中获取计数器值并将其增加一个并更新计算器值,这涉及两个查询,是否可以像下面这样在单个 NodeAPI 调用中完成它mysql query.I 目前正在使用 Mysql 作为数据库。
mysql_query("
UPDATE model
SET counter = counter + 1
WHERE model_id = '1'
");
谢谢
是的,您可以在单个环回远程方法调用中完成。假设您在请求中发送一个 Id
yourModel.remoteMethod = function(data, cb){
yourModel.findById(data.id, function(err, object){
if(err){
cb(err, null);
}
object.counter += 1;
object.save(function(saveErr, afterSaveObj){
cb(saveErr, afterSaveObj.counter);
})
});
}
这里的 cb 是一个回传给你的 remoteMethod 的回调。
鉴于您想要的 MySQL 语法,您似乎需要一个 原子计数器。
数据库事务
通过 MySQL 连接器,您可以使用 database transactions。 MySQL 连接器支持它。对于原子计数器来说有点矫枉过正,但它会完成工作。
这是一个示例,在自定义远程方法中
MyModel.someRemoteMethodForIncrementing = function(callback) {
// Start the transaction
MyModel.beginTransaction({
isolationLevel: MyModel.Transaction.READ_COMMITTED
}, function(err, tx) {
// Retrieve the current counter value as part of the transaction
MyModel.findById(id, {
transaction: tx
}, function(err, data) {
if (err) {
console.log(err);
return tx.rollback(function(err) {
callback(err);
});
}
// Increment the counter as part of the transaction
var inc = data.counter + 1;
MyModel.updateAttributes({
counter: inc
}, {
transaction: tx
}, function(err, newData) {
if (err) {
console.log(err);
return tx.rollback(function(err) {
callback(err);
});
}
// Commit the transaction to make it happen
tx.commit(function(err) {
if (err) return callback(err);
// Counter should have been incremented
callback();
});
});
});
});
};
我还没有测试过,但应该可以,请告诉我
扩展运算符
将来,您将可以使用 $inc (increment) extended operator,但目前只有 MongoDB 连接器支持,MySQL 不支持。
仅供参考,语法如下(仅适用于MongoDB)
PUT api/Model/:id?filter={"$inc":{"name":propertyToIncrement, "count":incrementAmount}}
在合并之前还有一个正在进行的 PR that I am trying to get landed to get MySQL support, but there are many things 需要完成。
模型中有一个名为 counter 的字段,每当我调用
之类的自定义远程方法时Request URL
http://loopback:3000/api/models/increment_counter
Request body
EMPTY
Response
{
"counter" : [Value after Increment]
}
目前要增加首先我必须从数据库中获取计数器值并将其增加一个并更新计算器值,这涉及两个查询,是否可以像下面这样在单个 NodeAPI 调用中完成它mysql query.I 目前正在使用 Mysql 作为数据库。
mysql_query("
UPDATE model
SET counter = counter + 1
WHERE model_id = '1'
");
谢谢
是的,您可以在单个环回远程方法调用中完成。假设您在请求中发送一个 Id
yourModel.remoteMethod = function(data, cb){
yourModel.findById(data.id, function(err, object){
if(err){
cb(err, null);
}
object.counter += 1;
object.save(function(saveErr, afterSaveObj){
cb(saveErr, afterSaveObj.counter);
})
});
}
这里的 cb 是一个回传给你的 remoteMethod 的回调。
鉴于您想要的 MySQL 语法,您似乎需要一个 原子计数器。
数据库事务
通过 MySQL 连接器,您可以使用 database transactions。 MySQL 连接器支持它。对于原子计数器来说有点矫枉过正,但它会完成工作。
这是一个示例,在自定义远程方法中
MyModel.someRemoteMethodForIncrementing = function(callback) {
// Start the transaction
MyModel.beginTransaction({
isolationLevel: MyModel.Transaction.READ_COMMITTED
}, function(err, tx) {
// Retrieve the current counter value as part of the transaction
MyModel.findById(id, {
transaction: tx
}, function(err, data) {
if (err) {
console.log(err);
return tx.rollback(function(err) {
callback(err);
});
}
// Increment the counter as part of the transaction
var inc = data.counter + 1;
MyModel.updateAttributes({
counter: inc
}, {
transaction: tx
}, function(err, newData) {
if (err) {
console.log(err);
return tx.rollback(function(err) {
callback(err);
});
}
// Commit the transaction to make it happen
tx.commit(function(err) {
if (err) return callback(err);
// Counter should have been incremented
callback();
});
});
});
});
};
我还没有测试过,但应该可以,请告诉我
扩展运算符
将来,您将可以使用 $inc (increment) extended operator,但目前只有 MongoDB 连接器支持,MySQL 不支持。
仅供参考,语法如下(仅适用于MongoDB)
PUT api/Model/:id?filter={"$inc":{"name":propertyToIncrement, "count":incrementAmount}}
在合并之前还有一个正在进行的 PR that I am trying to get landed to get MySQL support, but there are many things 需要完成。