HasOne

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

简介

HasOne 关系设置了, 一个与其他 模型的一对一关联。每一个 model的实例有且仅有一个 关联到目标 Model 实例的对象。

定义 HasOne 关系

使用命令行工具 $slc loopback:relation

案例, 供应商 和 账号信息。

common/models/supplier.json 供应商 Model

  1. {
  2. "name": "supplier",
  3. "base": "PersistedModel",
  4. "idInjection": true,
  5. "properties": {
  6. "name": {
  7. "type": "string"
  8. }
  9. },
  10. "validations": [],
  11. "relations": {
  12. "supplier_acct": {
  13. "type": "hasOne",
  14. "model": "account",
  15. "foreignKey": "supplierId"
  16. }
  17. },
  18. "acls": [],
  19. "methods": []
  20. }

一个供应商有一个帐户, 在 account Model 中申明外键 supplierId

common/models/account.json

  1. {
  2. "name": "account",
  3. "base": "PersistedModel",
  4. "idInjection": true,
  5. "properties": {
  6. "id": {
  7. "type": "number",
  8. "required": true
  9. },
  10. "acctmgr": {
  11. "type": "string"
  12. },
  13. "supplierId": {
  14. "type": "number",
  15. "required": true
  16. }
  17. },
  18. "validations": [],
  19. "relations": {},
  20. "acls": [],
  21. "methods": []
  22. }

你可以在脚本中添加这种关系, 但是不建议

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

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

添加方法到 HasOne 的模型

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

实例方法 描述
supplier.account(function(err, account) {}); 找到供应商账号
var supplier = supplier.account.build(data);
等效于
var account = new account({supplierId: supplier.id, …});
建立一个新的帐户,用于与供应商ID供应商设置为供应商的标识,不会涉及数据库(??)
supplier.account.create(data, function(err, account) {})
等效于
account.create({supplierId: supplier.id, …}, function(err, account) { })
通过 supplier 实例创建一个新的 账号数据,如果存在会报错
supplier.account.destroy(function(err) { }) 销毁 account 实例, 通过 supplier 实例
supplier.account.update({balance: 100}, function(err, account) { }) 更新相关账号