HasMany relations (一对多的关系)

  • 简介
  • 定义 HasMany 关系
  • 添加方法到 HasMany 的模型

定义

hasMany 关系建立一个一对多的连接到其他 Model, 经常 其他模型还会设置 belongsto 关联到 这个模型。
这个关系(hasMany) 表示每个实例,都关联着 0 个或者多个其他 model

例如,在与客户定单的应用程序,客户可以有许多订单,如下图所示。

has-many

目标 model (order) 有一个属性, customerId, 作为一个 外键关联到申明的Model(Customer) 的主键 id

定义 HasMany 关系

使用 slc loopback:relation 定义两个 model 之间的关系, 工具会提示你输入模型,相关模型的名称,以及其他必要信息, 然后工具将会修改模型定义文件common/models/modelName.json

案例, json 文件:

common/models/customer.json

  1. {
  2. "name": "Customer",
  3. "base": "PersistedModel",
  4. ...
  5. "relations": {
  6. "reviews": {
  7. "type": "hasMany",
  8. "model": "Review",
  9. "foreignKey": "authorId"
  10. },
  11. ...

另外,也可以在代码中定义,但是不建议

如果不指定foreignKey(外键), LoopBack 派生关系的名称和外键规则如下:

  • Relation name: 驼峰化 Model Name + 复数格式(默认s) ,如 Order => orders
  • Foreign key: 追加的关系名称 “Id”, 如 Order 的默认外键是 ordersId

添加方法到 HasMany 的模型

一旦定义了 HasMany 关系,Loopback将添加对应的方法到 Model 的原型对象 如: Customer.prototype.orders(function(){ })

实例案例方法 描述
customer.orders([where], function(err, orders) {}); 过滤查找 属于用户的订单信息
var order = customer.orders.build(data);
等效于
var order = new Order({customerId: customer.id, …});
建立一个新的订单 用于与客户 customerId设置为客户的ID。没有持久性参与
customer.orders.create(data, function(err, order) { });
等效于

Order.create({customerId: customer.id, …}, function(err, order) { }); | 创建一个属于 该客户的订单 |
| customer.orders.destroyAll(function(err) { }); | 删除所有该用户的订单 |