jcq*_*jcq 8 strongloop loopbackjs
我如何在Loopback模型中使用聚合函数?如果我有一个由mysql数据库支持的模型,我可以让Model1与Model2具有hasMany关系(具有给定的数字属性),并且在Model1中有一个属性可以从Model2中获取该字段的SUM吗?
{
"Model1" : {
"Relations" : {
"model2s" : {
"type": "hasMany",
"model": "Model2",
"foreignKey": "model1Id"
}
},
"Properties" : {
"total" : {
"type": "Number"
[SUM of Model2 'amount' field]
}
}
},
"Model2" : {
"Relations" : {
"model1s" : {
"type": "belongsTo",
"model": "Model1",
"foreignKey": "model1Id"
}
},
"Properties" : {
"amount" : {
"type": "Number"
}
}
}
}
在另一个问题上,将条件放入模型的正确方法是什么,以便getter返回的值取决于某个表达式?我想从关系中返回一个值(如果存在),否则返回主模型上存在的值.
我试过这个(伪代码):
module.exports = function(MyModel) {
MyModel.on('attached', function() {
var app = MyModel.app;
MyModel.getter['total'] = function() {
return (this.model1Id ? this.model1.total : this.total);
};
});
};
但是,我最终得到一个RangeError: Maximum call stack size exceeded错误(类似于这个问题中提到的).我假设这是因为它一遍又一遍地递归调用getter,但我不确定解决问题的方法.
提前致谢...
mas*_*ner 13
这可以通过Loopback的操作挂钩来完成.
Model1.observe('loaded', function (ctx, next) {
if (ctx.instance) {
var sum = 0;
Model1.app.models.Model2.find({
where: {
model1Id: ctx.instance.id
},
fields: {
givenNumericProperty: true
}
}, function (err, model2s) {
if (err) return next(err);
if (model2s.length) {
model2s.forEach(function (model2) {
sum += model2.givenNumericProperty;
});
ctx.instance.calculatedProperty = sum;
}
return next();
});
} else {
return next();
}
});
Run Code Online (Sandbox Code Playgroud)
AFAIK环回目前不支持聚合函数/属性.请打开github问题以跟踪此功能请求.
注意,在访问相关模型的数据是一个异步操作,因此不可能可靠地实现一个属性(getter函数)返回汇总结果.
这是一个模拟显示如何正确实现计算total:
MyModel.prototype.getTotal = function(cb) {
if (!this.model1Id) {
// No related model, return the total from this model.
return cb(null, this.total);
}
// Fetch the related model and return its total
this.model1(function(err, model1) {
if (err)
cb(err);
else
cb(null, model1.total);
});
}
Run Code Online (Sandbox Code Playgroud)
在另一个问题上,将条件放入模型的正确方法是什么,以便getter返回的值取决于某个表达式?我最终得到一个
RangeError: Maximum call stack size exceeded错误
正如我在你已经链接到的答案中解释的那样,this.total调用你的自定义getter函数,然后调用this.total它等等.
解决方案是从内部数据对象中读取值:
MyModel.getter['total'] = function() {
return this.__data.total;
};
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6427 次 |
| 最近记录: |