数据模型关联

数据模型间支持 hasOnehasMany方式关联,查询时通过 withs参数,直接查询关联数据。

编写供应商 supplier 和用户 user 两个数据模型,一个用户对应一家供应商,一家供应商有多个用户。在查询用户时,同时返回所属供应商的信息,查询供应商时,同时返回该供应商的用户列表。

供应商模型 supplier:

查看源码

用户模型 user :

查看源码

创建数据表

yao migrate

关联关系声明

关联关系通过 relations 中声明, 一个数据模型支持多个映射关系声明, 数据结构为{"relation_name":ObjectRelation, "relation_name":ObjectRelation ,...}

Object Relation 数据结构:

字段类型必填项说明
namestring关联名称,查询时通过这个名称引用
typeenum与当前数据模型的关系类型. hasOne 一对一, hasMany 一对多。
modelstring关联数据模型 名称
keystring关联数据模型 字段的名称,用于关联映射 (关联数据模型.key = 当前数据模型.foreign)
foreignstring当前数据模型 字段的名称,用于关联映射 (关联数据模型.key = 当前数据模型.foreign)
queryobject关联数据模型 的查询条件,可以在查询时重载。 例: { "select": ["id", "name"] }

hasOne

查询用户时,同时返回该用户所属供应商的信息。修改用户模型描述文件 user.mod.yao,添加 hasOne 关联关系声明。

查看源码

数据查询

查询用户同时,查询所有供应商信息:

yao run models.user.Find 1 '::{"withs":{ "supplier": {} }}'
yao run models.user.Get '::{"withs":{ "supplier": {} }}'

指定关联模型的选取字段:

yao run models.user.Find 1 '::{"withs":{ "supplier": {"query":{ "select":["name"] }} }}'

按关联模型的字段查询条件:

yao run models.user.Get '::{"withs":{ "supplier": {} }, "wheres":[{"rel":"supplier", "column":"name", "value":"Yao App Engine" }]}'

在 JS 中使用任意关联关系 /scripts/test.js

function test() {
var user = Process("models.user.get", {
withs: {
supplier: {
query: {
select: ["name", "id"],
},
},
},
wheres: [{ column: "supplier_id", value: 1, op: "=" }],
orders: [{ column: "id", option: "desc" }],
limit: 1,
});
return user;
}
yao run scripts.test.test

hasMany

查询供应商时,同时返回该供应商的用户信息。修改用户模型描述文件 supplier.mod.yao,添加 hasMany 关联关系声明。

查看源码

数据查询

查询供应商时,同时查询所属用户信息:

yao run models.supplier.Find 1 '::{"withs":{ "users": {} }}'
yao run models.supplier.Get '::{"withs":{ "users": {} }}'

指定关联模型的选取字段:

yao run models.supplier.Find 1 '::{"withs":{ "users": { "query":{"select":["name"] }} }}'

指定关联用户筛选条件:

yao run models.supplier.Find 1 '::{"withs":{ "users": { "wheres":[{"column":"name", "value":"张无忌"}] } }}'

数据模型关联

数据模型间支持 hasOnehasMany方式关联,查询时通过 withs参数,直接查询关联数据。

编写供应商 supplier 和用户 user 两个数据模型,一个用户对应一家供应商,一家供应商有多个用户。在查询用户时,同时返回所属供应商的信息,查询供应商时,同时返回该供应商的用户列表。

供应商模型 supplier:

查看源码

用户模型 user :

查看源码

创建数据表

yao migrate

关联关系声明

关联关系通过 relations 中声明, 一个数据模型支持多个映射关系声明, 数据结构为{"relation_name":ObjectRelation, "relation_name":ObjectRelation ,...}

Object Relation 数据结构:

字段类型必填项说明
namestring关联名称,查询时通过这个名称引用
typeenum与当前数据模型的关系类型. hasOne 一对一, hasMany 一对多。
modelstring关联数据模型 名称
keystring关联数据模型 字段的名称,用于关联映射 (关联数据模型.key = 当前数据模型.foreign)
foreignstring当前数据模型 字段的名称,用于关联映射 (关联数据模型.key = 当前数据模型.foreign)
queryobject关联数据模型 的查询条件,可以在查询时重载。 例: { "select": ["id", "name"] }

hasOne

查询用户时,同时返回该用户所属供应商的信息。修改用户模型描述文件 user.mod.yao,添加 hasOne 关联关系声明。

查看源码

数据查询

查询用户同时,查询所有供应商信息:

yao run models.user.Find 1 '::{"withs":{ "supplier": {} }}'
yao run models.user.Get '::{"withs":{ "supplier": {} }}'

指定关联模型的选取字段:

yao run models.user.Find 1 '::{"withs":{ "supplier": {"query":{ "select":["name"] }} }}'

按关联模型的字段查询条件:

yao run models.user.Get '::{"withs":{ "supplier": {} }, "wheres":[{"rel":"supplier", "column":"name", "value":"Yao App Engine" }]}'

在 JS 中使用任意关联关系 /scripts/test.js

function test() {
var user = Process("models.user.get", {
withs: {
supplier: {
query: {
select: ["name", "id"],
},
},
},
wheres: [{ column: "supplier_id", value: 1, op: "=" }],
orders: [{ column: "id", option: "desc" }],
limit: 1,
});
return user;
}
yao run scripts.test.test

hasMany

查询供应商时,同时返回该供应商的用户信息。修改用户模型描述文件 supplier.mod.yao,添加 hasMany 关联关系声明。

查看源码

数据查询

查询供应商时,同时查询所属用户信息:

yao run models.supplier.Find 1 '::{"withs":{ "users": {} }}'
yao run models.supplier.Get '::{"withs":{ "users": {} }}'

指定关联模型的选取字段:

yao run models.supplier.Find 1 '::{"withs":{ "users": { "query":{"select":["name"] }} }}'

指定关联用户筛选条件:

yao run models.supplier.Find 1 '::{"withs":{ "users": { "wheres":[{"column":"name", "value":"张无忌"}] } }}'