Skip to content
导航栏

Yao 模型中的关联关系

先看看文档说明:数据模型关联

理解两个模型之间的关联关系的关键点在于理解模型中的relations定义。特别是这两个字段:

  • key 用于关联映射 (关联数据模型.key = 当前数据模型.foreign)
  • foreign 用于关联映射 (关联数据模型.key = 当前数据模型.foreign)

定义两个测试模型:

下面从user模型看关联关系的定义:

一个用户对应多个供应商

sh
yao run models.user.Find 1 '::{"withs":{"many_suppliers":{}}}'

user.mod.json关联关系定义:

json
{
  "many_suppliers": {
    "key": "user_id",
    "foreign": "id",
    "model": "supplier",
    "type": "hasMany"
  }
}

等于筛选条件:user.id == suppliers.user_idsuppliers.user_id保存了对模型user.id的引用。按这个条件可以找到用户对应的多个供应商。使用hasMany比较合适

sh
yao run models.user.Find 1 '::{"withs":{"one_supplier":{}}}'

返回结果是数组。

json
{
  "app_id": "123",
  "id": 1,
  "many_suppliers": [
    {
      "app_id": "456",
      "id": 1,
      "name": "象传智慧",
      "user_id": 1
    },
    {
      "app_id": "456",
      "id": 2,
      "name": "Yao App Engine",
      "user_id": 1
    }
  ],
  "name": "张无忌",
  "supplier_id": 1
}

一个用户对应一个供应商

sh
yao run models.user.Find 1 '::{"withs":{"one_supplier":{}}}'

user.mod.json关联关系定义:

json
{
  "one_supplier": {
    "key": "id",
    "foreign": "supplier_id",
    "model": "supplier",
    "type": "hasOne"
  }
}

等于筛选条件:user.supplier_id == supplier.id。由于 supplier.id 是主键,只可能会有一条记录存在,所有使用 hasOne 比较合适。

结果:只会返回一个供应商。

json
{
  "app_id": "123",
  "id": 1,
  "name": "张无忌",
  "one_supplier": {
    "app_id": "456",
    "id": 1,
    "name": "象传智慧",
    "user_id": 1
  },
  "supplier_id": 1
}

非主键关连关系。

除了使用两个模型的主键来定义模型的关联关系外,还可以使用模型中的非关键字段来定义关系。

模型usersupplier中都定义了一个app_id的字段。

sh
yao run models.user.Find 2 '::{"withs":{"apps":{}}}'

关联关系定义。等于筛选条件:user.app_id == supplier.app_id

json
{
  "apps": {
    "key": "app_id",
    "foreign": "app_id",
    "model": "supplier",
    "type": "hasMany"
  }
}

等于筛选条件user.app_id == supplier.app_id,非主键关联,设置类型为hasMany

output:

sh
{
    "app_id": "456",
    "id": 2,
    "name": "李光富",
    "supplier_id": 1,
    "suppliers": [
        {
            "app_id": "456",
            "id": 1,
            "name": "象传智慧"
        },
        {
            "app_id": "456",
            "id": 2,
            "name": "Yao App Engine"
        }
    ]
}

总结

通过对比一对一与一对多关系的定义发现,灵活的使用relations.keyrelations.foreign。可以达到不同的效果。

如何实现一个供应商对应多个用户呢?在模型supplier中定义关联关系即可。