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_id
,suppliers.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
}
非主键关连关系。
除了使用两个模型的主键来定义模型的关联关系外,还可以使用模型中的非关键字段来定义关系。
模型user
与supplier
中都定义了一个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.key
与relations.foreign
。可以达到不同的效果。
如何实现一个供应商对应多个用户呢?在模型supplier
中定义关联关系即可。