APIJSON-实现一对一,一对多复杂查询

举报
青年码农 发表于 2022/08/28 00:18:45 2022/08/28
【摘要】 点击上方“青年码农”关注 回复“源码”可获取各种资料 APIJSON 是一种专为 API 而生的 JSON 网络传输协议 以及 基于这套协议实现的 ORM 库。为各种增删改查提供了完全自动化的万能 API,零代码实时满足千变万化的各种新增和变更需求。能大幅降低开发和沟通成本,简化开发流程,缩短开发周期。 之前的一篇文...

点击上方“青年码农”关注

回复“源码”可获取各种资料

APIJSON 是一种专为 API 而生的 JSON 网络传输协议 以及 基于这套协议实现的 ORM 库。为各种增删改查提供了完全自动化的万能 API,零代码实时满足千变万化的各种新增和变更需求。能大幅降低开发和沟通成本,简化开发流程,缩短开发周期。

之前的一篇文章讲解了 APIJSON 的简单用法‍,链接:APIJSON-零代码接口和文档JSON 协议 与 ORM 库 ,今天说说复杂查询是如何实现的。

在演示查询之前我们先建几个表,Test_user、Test_user_moent_ref(关联表)、Test_moment,关联关系如图

4a45b86e7198bd6a47c96090b5965b5b.png

随便添加几条数据,必须保证关联关系是正确的。

f3ca0a78d061c5cff61b9236d0807b06.png

我们先用 SQL 查询,查询结果如下

cb5c38e53231ff3d4fd13a8e4871dee1.png

一 单表查询 - 单条数据

单条数据

单表查询返回一条数据,用 Test_user 做示例,请求格式如下,


   
  1. {
  2.    "Test_user": {}
  3. }

APIJSON 会转换为

SELECT * FROM test_user LIMIT 1 OFFSET
  

返回格式如下

780970a474abc59e8f461d59e72da7f1.png

2 过滤数据

也可以过滤,比如 id=2 的数据


   
  1. {
  2.     "Test_user": {
  3.         "id":"2"
  4.     }
  5. }

8a47b43e16f2dd1f24966c9bbe6efd23.png

3 判断是否存在


   
  1. {
  2.     "Test_user": {
  3.         "id}{@": {
  4.             "from""Test_user_moent_ref",
  5.             "Test_user_moent_ref": {
  6.                 "id"1
  7.             }
  8.         }
  9.     }
  10. }

}{ 表示 EXISTS,@ 后面是 子查询 对象,from 为目标表 Table 的名称;

23b0a74584387c4cbb91fcdb8c929a45.png

二 单表查询 - 多条数据

1 多条数据

单表查询返回多条数据,用 Test_user 做示例,请求格式如下,


   
  1. {
  2.    "[]":{
  3.     "Test_user": {}
  4.    }
  5. }

返回结果

bfce1a733de56befcfbe450b0dee5fb1.png

2 分页查询


   
  1. {
  2.    "[]": {
  3.       "count"10,
  4.       "page"0,
  5.       "Test_user": {
  6.          "second_name""唐三"
  7.       }
  8.    }
  9. }

查询结果

4024e0a8fd16a3508116fbbe8c4090a6.png

过滤字段


   
  1. {
  2.    "[]":{
  3.     "Test_user": {
  4.        "second_name":"唐三"
  5.     }
  6.    }
  7. }

过滤second_name=唐三的数据

0e401f4bdd58c89290a974f7ae1a7372.png

4 模糊查询


   
  1. {
  2.    "[]": {
  3.       "count"10,
  4.       "page"0,
  5.       "Test_user": {
  6.          "second_name$""唐%"
  7.       }
  8.    }
  9. }

%表示任意字符,上面搜索是以开始,可以是任意SQL搜索表达式字符串,如 %key%(包含key), key%(以key开始), %k%e%y%(包含字母k,e,y) 等。

312cd80aad1804206abe4e13f5878b52.png

正则表达式


   
  1. {
  2.    "[]": {
  3.       "count"10,
  4.       "page"0,
  5.       "Test_user": {
  6.          "second_name~""\u5510"
  7.       }
  8.    }
  9. }

正则也很简单,就是把汉字唐转化ASCII码,搜索包含唐的数据

1630dbfc5d5b833012942210227cf502.png

6 连续范围


   
  1. {
  2.    "[]": {
  3.       "count"10,
  4.       "page"0,
  5.       "Test_user": {
  6.          "id%""1,9"
  7.       }
  8.    }
  9. }

可以查询范围内的,由于我这边数据比较少,所以用 id

93f6edec931cfb81dfeb26e26aca958f.png

7 控制返回字段


   
  1. {
  2.    "[]": {
  3.       "count"10,
  4.       "page"0,
  5.       "Test_user": {
  6.          "@column":"second_name",
  7.          "id%""1,9"
  8.       }
  9.    }
  10. }

只返回second_name字段

e38ffea63ea4c9cc3e08f298e383fb73.png

8 给返回字段设置别名


   
  1. {
  2.    "[]": {
  3.       "count"10,
  4.       "page"0,
  5.       "Test_user": {
  6.          "@column":"second_name:s_name",
  7.          "id%""1,9"
  8.       }
  9.    }
  10. }

second_name设置别名为s_name

16f14d23011fb70046d9c335d093cef1.png

9 比较运算


   
  1. {
  2.    "[]": {
  3.       "count"10,
  4.       "page"0,
  5.       "Test_user": {
  6.          "id>""1"
  7.       }
  8.    }
  9. }

比较运算符>, <, >=, <=都支持,不支持key=和key!=这两种,而是使用更为简单的 "key":Object 和 "key!":Object 替代。

e52f1902161c6683c449c16acac342fb.png

10 逻辑运算


   
  1. {
  2.    "[]": {
  3.       "count"10,
  4.       "page"0,
  5.       "Test_user": {
  6.          "id&{}"">1,<3"
  7.       }
  8.    }
  9. }

逻辑运算符&, |, !都支持,但是使用场景不同

  • & 可用于"key&{}":"条件"等

  • | 可用于"key|{}":"条件", "key|{}":[]等,一般可省略

  • ! 可单独使用,如"key!":Object,也可像&,|一样配合其他功能符使用

4222c527c65764fa23505ad92f0cc111.png

三 两张表-一对一关联查询

用Test_user和Test_user_moent_ref做示例,通过Test_user的id字段和Test_user_moent_ref的entity_id字段关联


   
  1. {
  2.     "Test_user": {},
  3.     "Test_user_moent_ref":{
  4.         "entity_id@":"/Test_user/id"
  5.     }
  6. }

返回两个表的所有字段

1ed40c11f1b65589f038f450ec6a70f4.png

可以指定返回字段

bb62ca5e04ce3f2e7453a3dc6ff230e5.png

b1e8f84f79b01a80c42c71140f8170c6.png

两张表-一对多关联查询

还是Test_user和Test_user_moent_ref做示例,通过Test_user的id字段和Test_user_moent_ref的entity_id字段关联


   
  1. {
  2.     "Test_user": {},
  3.     "Test_user_moent_ref[]":{
  4.         "Test_user_moent_ref":{
  5.             "entity_id@":"Test_user/id"
  6.         }
  7.     }
  8. }

返回数据如下

ddc672b85a417dbeeb079c377780fb62.png

两张表-数组内一对一关联查询

通过 Test_user 的 id 字段和 Test_user_moent_ref 的 entity_id 字段关联


   
  1. {
  2.     "[]":{
  3.         "Test_user": {},
  4.         "Test_user_moent_ref":{
  5.             "entity_id@":"[]/Test_user/id"
  6.         }
  7.     }
  8. }

其中

"entity_id@":"[]/Test_user/id
  

要根据 Test_user 在数组中的位置 index 来动态改变

请求返回格式

589c8d69942c1f8c23608954328f68d3.png

两张表-数组内一对多关联查询

通过 Test_user 的 id 字段和 Test_user_moent_ref 的 entity_id 字段关联


   
  1. {
  2.     "[]":{
  3.         "Test_user": {},
  4.         "Test_user_moent_ref[]":{
  5.         "Test_user_moent_ref":{
  6.             "entity_id@":"[]/Test_user/id"
  7.         }
  8.         }
  9.     }
  10. }

注意事项和上面一样,返回格式如下

0b62889a826aa1df69ec04b56dcb5d06.png

七 三张表及以上查询

通过 Test_user 的 id 字段和 Test_user_moent_ref 的 entity_id 字段关联,Test_user_moent_ref 的 component_id 字段和 Test_monent 的 id 字段关联,查询方式和上面大同小异。


   
  1. {
  2.     "[]": {
  3.         "join""</Test_user_moent_ref,</Test_monent",
  4.         "Test_user": {
  5.             "@column":"id,second_name"
  6.         },
  7.         "Test_user_moent_ref": {
  8.             "entity_id@""/Test_user/id"
  9.         },
  10.         "Test_monent":{
  11.             "id@""/Test_user_moent_ref/component_id"
  12.         }
  13.     }
  14. }

数据是返回了,但是有点小问题

1744d9286afd0cb684516afca2cc357b.png

用 SQL 查询应该是这个样子的,但是返回的数据有点区别。

74378517b7901fa3b7497617df1e54ec.png

3da114a81d8e18f9b74a48e7343b3dde.jpeg

后续研究透彻再详细讲解多表查询吧,如果有大佬能提供思路,也是非常感谢!

文章来源: blog.csdn.net,作者:NMGWAP,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/NMGWAP/article/details/126552976

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。