Loopbackjs 环回存储在单个请求中有许多模型

Loopbackjs 环回存储在单个请求中有许多模型,loopbackjs,strongloop,Loopbackjs,Strongloop,我有两个模型,它们通过许多关系而相互关联 客户拥有许多客户电话 创建新的客户时,我希望将相关的客户电话作为单个请求的一部分传递。这似乎是一种常见的需求,如果我希望实现的方法是错误的,那么首选的方法是什么 这是用于创建客户的url:POST/api/Customers 对上述url的请求将是req.body { "name": "Foo", "customerPhones": [ { "phoneNumber": "8085551234" }, { "phoneNumber

我有两个模型,它们通过许多关系而相互关联

客户
拥有许多
客户电话

创建新的
客户
时,我希望将相关的
客户电话
作为单个请求的一部分传递。这似乎是一种常见的需求,如果我希望实现的方法是错误的,那么首选的方法是什么

这是用于创建客户的url:
POST/api/Customers

对上述url的请求将是req.body

{
  "name": "Foo",
  "customerPhones": [
    { "phoneNumber": "8085551234" },
    { "phoneNumber": "8085554567" }
  ]
}
环回模型配置:

Customer.json

{
  "name": "Customer",
  "base": "User",
  "properties": {
    "name": {
      "type": "string",
      "required": true
    }
  },
  "relations": {
    "customerPhones": {
      "type": "hasMany",
      "model": "CustomerPhone",
      "foreignKey": ""
    }
  }
}
{
  "name": "CustomerPhone",
  "base": "PersistedModel",
  "properties": {
    "phoneNumber": {
      "type": "string",
      "required": true
    },
    "customerId": {
      "type": "number",
      "required": true
    }
  },
  "relations": {
    "customer": {
      "type": "belongsTo",
      "model": "Customer",
      "foreignKey": "customerId"
    }
  }
}
CustomerPhone.json

{
  "name": "Customer",
  "base": "User",
  "properties": {
    "name": {
      "type": "string",
      "required": true
    }
  },
  "relations": {
    "customerPhones": {
      "type": "hasMany",
      "model": "CustomerPhone",
      "foreignKey": ""
    }
  }
}
{
  "name": "CustomerPhone",
  "base": "PersistedModel",
  "properties": {
    "phoneNumber": {
      "type": "string",
      "required": true
    },
    "customerId": {
      "type": "number",
      "required": true
    }
  },
  "relations": {
    "customer": {
      "type": "belongsTo",
      "model": "Customer",
      "foreignKey": "customerId"
    }
  }
}

如果您使用的是NoSQL数据库连接器,则可以忽略另一个
CustomerPhone
模型,并将
customerPhones
属性作为数组添加到
Customer
模型中


对于SQL数据库连接器,您可以创建一个远程方法,同时执行
POST/api/Customers
POST/api/Customers/id/CustomerPhones
。对于多个电话号码,您可以在req.body中迭代
customerPhones
字段,每次执行
POST/api/Customers/id/customerPhones

如果这有帮助,您可以在一个步骤中插入号码,而不是迭代:

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方法,但是这个解决方案非常干净。

不幸的是,这仍然没有通过环回实现。请参阅此问题。

我希望基本上在同一通话中创建新客户和新手机。由于客户尚不存在,我无法使用Customer/:id/电话。customerId还不清楚。投票结果被否决了,因为它表示希望在一个系统中创建客户和电话request@Anoop.P.A起床,再次阅读问题。它说它想在一个请求中输入两个数据。在您的回答中,客户数据输入已经完成,您正在用第二个请求更新。所以您的回答是错误的。我正在使用SQL。你的建议就是我最终要做的。我创建了一个名为create的新远程方法。我认为没有其他方法可以做到这一点,因为
CustomerPhones
依赖于
Customer
对象的
belongsTo
关系。