我有两个通过hasMany关系相关的模型。
Customer
有很多CustomerPhones
在创建新的Customer
时,我想将相关的CustomerPhones
作为单个请求的一部分传递。这似乎是一种常见的需求,如果我想要实现的方法是错误的,那么这样做的首选方法是什么?
这是创建客户的网址:POST /api/Customers
上面url的请求将是req.body
{
"name": "Foo",
"customerPhones": [
{ "phoneNumber": "8085551234" },
{ "phoneNumber": "8085554567" }
]
}
Loopback模型配置:
Customer.json
{
"name": "Customer",
"base": "User",
"properties": {
"name": {
"type": "string",
"required": true
}
},
"relations": {
"customerPhones": {
"type": "hasMany",
"model": "CustomerPhone",
"foreignKey": ""
}
}
}
CustomerPhone.json
{
"name": "CustomerPhone",
"base": "PersistedModel",
"properties": {
"phoneNumber": {
"type": "string",
"required": true
},
"customerId": {
"type": "number",
"required": true
}
},
"relations": {
"customer": {
"type": "belongsTo",
"model": "Customer",
"foreignKey": "customerId"
}
}
}
如果这可以是任何帮助,而不是迭代,您可以在一个步骤中插入数字,如下所示:
curl -X POST --header "Content-Type: application/json" --header "Accept: application/json" -d "[{
\"number\": \"1000\",
\"type\": \"mobile\",
\"customerId\": 1
}, {
\"number\": \"1004\",
\"type\": \"home\",
\"customerId\": 1
}, {
\"number\": \"1400\",
\"type\": \"work\",
\"customerId\": 1
}]" "http://127.0.0.1:3000/api/customers/1/phones"
我不确定这是否是最佳解决方案,但在此我最终做了什么。我在Customer上创建了一个名为createNew的新RemoteMethod。在这个新的远程方法中,我使用通过模型关系添加的方法。
Customer.createNew = function (data) {
var newCustomerId;
var customerPhones = null;
if (data.customerPhones && data.customerPhones.length) {
customerPhones = data.customerPhones;
}
return Customer
.create(data)
.then(function createCustomerPhones (customer) {
newCustomerId = customer.id;
if (customerPhones) {
customer.customerPhones.create(customerPhones);
}
})
.then(function fetchNewCustomerIncludeRelated () {
return Customer
.findById(newCustomerId, {
include: [ 'customerPhones' ]
});
})
.catch(function (err) {
return err;
});
};
为了使这更安全,我需要将它包装在一个事务中。我希望使用基础CRUD方法,但这个解决方案相当干净。
如果您正在使用NoSQL数据库连接器,那么您可以忽略另一个CustomerPhone
模型并在customerPhones
模型中将Customer
属性添加为数组。
另外,对于SQL数据库连接器,您可以创建一个同时执行POST /api/Customers
和POST /api/Customers/id/CustomerPhones
的远程方法。对于多个电话号码,您可以迭代req.body中的customerPhones
字段并每次执行POST /api/Customers/id/CustomerPhones
。
不幸的是,这仍然没有通过环回实现。请参阅本期https://github.com/strongloop/loopback-datasource-juggler/issues/846。