loopback在单个请求中保存相关的hasmany模型

时间:2015-12-04 21:12:42

标签: loopbackjs strongloop

我有两个通过hasMany关系相关的模型。

Customer hasMany CustomerPhones

创建新的Customer时,我希望将相关的CustomerPhones作为单个请求的一部分传递。这似乎是一种常见的需求,如果我想要实现的方法是错误的,那么这样做的首选方式是什么?

这是创建客户的网址:POST /api/Customers

上述网址的请求为 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"
    }
  }
}

4 个答案:

答案 0 :(得分:1)

我不确定这是否是最佳解决方案,但在此我最终做了什么。我在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方法,但这个解决方案相当干净。

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

如果这可能是任何帮助,而不是迭代,您可以在一个步骤中插入数字,如下所示:

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"

答案 3 :(得分:0)

不幸的是,环回还没有实现。请参阅此问题https://github.com/strongloop/loopback-datasource-juggler/issues/846