在Excel模型的外键关键对象上标注ref-connection,这样生成的一对多关联属性上会生成connection标签,并自动生成对应的Connection属性。
例如NopAuthResource的site属性上标注ref-connection,则会自动在NopAuthSite对象的resources属性上增加connection标签。
通过元编程机制会在编译期为meta文件增加对应的Connection属性,例如resourcesConnection。在_dump
目录下可以看到最后生成的属性定义
<meta> <props> <prop name="resources" displayName="资源列表" i18n-en:displayName="Resources" tagSet="pub,connection" ext:kind="to-many" internal="true" ext:joinLeftProp="siteId" ext:joinRightProp="siteId" ext:joinRightDisplayProp="displayName" insertable="false" updatable="false" lazy="true"> <schema type="io.nop.orm.IOrmEntitySet<io.nop.auth.dao.entity.NopAuthResource>" bizObjName="NopAuthResource"/> </prop> <prop name="resourcesConnection" displayName="资源列表" internal="true" graphql:connectionProp="resources" graphql:queryMethod="findConnection"> <schema type="io.nop.api.core.beans.graphql.GraphQLConnection<io.nop.auth.dao.entity.NopAuthResource>" bizObjName="NopAuthResource"/> </prop> </props> </meta>
|
生成的resourcesConnection节点上通过graphql:connectionProp属性引用实体上的一个一对多关联属性,会自动使用这个关联属性对应的关联条件进行过滤。
具体测试用例可以参见 TestConnectionProp
resourcesConnection可以接收的参数为GraphQLConnectionInput类型
public class GraphQLConnectionInput {
int first; int last; String after; String before;
long offset; TreeBean filter; List<OrderFieldBean> orderBy; }
|
返回的结果类型为GraphQLConnection类型
class GraphQLConnection<T> {
long total; List<GraphQLEdgeBean> edges;
List<T> items;
GraphQLPageInfo pageInfo; }
class GraphQLPageInfo { String startCursor; String endCursor; Boolean hasNextPage; Boolean hasPreviousPage; }
|
对同一个子表应用不同的查询条件返回多个子集合
query($filter1:Map, $filter2:Map){ MyObject__get(id:3){ activeRecords: mySubObjectConnection(filter:$filter1,limit:5){ total items{ id } }
inactiveRecords: mySubObjectConnection(filter:$filter2, limit:5){ total items{ id } } } }
|
这里的filter1和filter2是两个不同的查询条件,可以在前端传入不同的查询条件,都是查询同一个子表对象mySubObject
,但是返回的结果是不同的。
REST请求时通过_subArgs
简化传参方式
/r/MyObject__get?id=3&@selection=activeRecords:mySubObjectConnection,inactiveRecords:mySubObjectConnection
{ "_subArgs.activeRecords.limit": 5, "_subArgs.activeRecords.filter_status": 1, "_subArgs.inactiveRecords.limit": 5, "_subArgs.inactiveRecords.filter_status": 0 }
|
后台GraphQLWebService接收到_subArgs.
为前缀的参数之后会把它们转换为针对子属性的函数参数,并识别filter_
前缀,将特殊前缀的变量收集在一起,转换为FilterBean对象。
在Excel模型中为关联属性设置ref-query
标签
如果在to-one
关联上设置了ref-query
标签,则生成父表到子表的一对多集合属性时,会增加query
标签。在meta-gen.xlib
中,对于具有query标签的一对多属性,
会自动增加graphql:findMethod="findList"
配置,从而为该属性增加分页查询的支持。
<prop name="children" graphql:findMethod="findList">
</prop>
|
在前台可以传入filter过滤条件和offset/limit分页参数
MyEntity__get(id:3) { children(filter: {...}, limit:10){ name, status } }
|
在meta的prop节点上,可以配置graphql:maxFetchSize
从而自动限制获取条数为maxFetchSize。如果不指定,则受到全局的maxPageSize的限制。