区块链数据索引 SubQuery | 快速入门第四课:SubQuery 关系详解
Editor's Note
SubQuery入门开发第四期。
The following article is from OneBlock Community Author Kyrin
第四课课程大纲
第四课 — SubQuery 关系 一对一关系 一对多关系 schema中定义一对多关系
在mapping中处理一对多关系
查询一堆多关系的数据 练习:检索账户转账 多对多关系 反向查询 练习:账户转账并使用反向查询
一个实体往往与其他实体有嵌套的关系。默认情况下,将字段值设置为另一个实体名称将定义这两个实体之间的一对一关系。当只有一个实体被映射到另一个实体时,实体关系被默认为一对一。
一对一关系
type Person @entity {
id: ID!
passport: Passport!
}
type Passport @entity {
id: ID!
owner: Person!
}
type Account @entity {
id: ID!
}
type Transfer @entity {
id: ID!
amount: BigInt
from: Account!
to: Account!
}
多对多关系
type Person @entity {
id: ID!
name: String!
}
type PersonGroup @entity {
id: ID!
person: Person!
Group: Group!
}
type Group @entity {
id: ID!
name: String!
}
Lesson4实战
type transfer @entity {
id: ID!
from: Account!
to: Account!
amount: BigInt!
}
type Account @entity {
id: ID!
}
mappingHandlers.ts
import {SubstrateExtrinsic,SubstrateEvent,SubstrateBlock} from "@subql/types";
import {Transfer, Account} from "../types";
import {Balance, AccountId} from "@polkadot/types/interfaces";
export async function handleTransfer(event: SubstrateEvent): Promise<void> {
const {event: {data: [fromAccount, toAccount, amount]}} = event;
const record = new Transfer(`${event.block.block.header.number.toString()}-${event.idx}`)
await makeSureAccount((fromAccount as AccountId).toString());
await makeSureAccount((toAccount as AccountId).toString());
record.fromId = (fromAccount as AccountId).toString();
record.toId = (toAccount as AccountId).toString();
record.amount = (amount as Balance).toBigInt();
await record.save();
}
async function makeSureAccount(accountId:string): Promise<void> {
const checkAccount = await Account.get(accountId);
if(!checkAccount){
await new Account(accountId).save();
}
mappingHandlers.ts
反向链接
反向链接对于数据库的结构不会造成改变。在 schema.graphql 文件中加入两行 sendTransfer 和 receivedTransfer:
type transfer @entity {
id: ID!
from: Account!
to: Account!
amount: BigInt!
}
type Account @entity {
id: ID!
sentTransfer: [transfer] @derivedFrom(field:"from")
receivedTransfer: [transfer] @derivedFrom(field:"to")
}
参考资料
● GraphQL 开发原则:https://principles.graphql.cn/
● SubQuery 开发文档:https://doc.subquery.network/
课程示例代码:https://github.com/subquery/tutorials-validator-threshold
🎉 新课预告:「SubQuery 入门——轻松学会区块链数据索引开发」第二期将根据技术更迭以及学员反馈课程将全面升级,由 OneBlock+ 与 SubQuery 共同推出!通过课程 6 大模块的讲解,你将熟悉掌握如何将你的区块链项目建立 SubQuery 数据源从而进行链上数据索引,包括开发复杂的 SubQuery 项目和将其部署到 SubQuery 项目托管中。即使你是零基础开发者也可以学习本次课程,实现轻松为一个新区块链项目构建数据源,学会区块链数据索引开发。
报名链接:https://jhp.h5.xeknow.com/s/41DLRh
关于我们
关于我们
One Block+ 是中国最大的 Substrate 技术开发者社区,也是 Parity 在亚洲唯一的运营合作伙伴,波卡生态早期项目的创始人、CTO、核心开发者大部分都来自 One Block+ 社区。
Twitter: https://twitter.com/OneBlock_
Medium: https://medium.com/@OneBlockplus
Telegram: https://t.me/oneblock_dev
Discord: https://discord.gg/z2XZZWEcaa
Bilibili: https://space.bilibili.com/1650224419
YouTube: https://www.youtube.com/channel/UCWo2r3wA6brw3ztr-JmzyXA
关于SubQuery
SubQuery是Polkadot的领先数据提供商,支持在Layer_1区块链(Polkadot)和去中心化应用程序之间建立索引和查询层。SubQuery的数据服务目前在大多数Polkadot,Kusama crowdloan和平行链拍卖网站使用。SubQuery 的协定是通过 SubQuery SDK 提取出区块链数据的特性,允许开发人员专注于部署其核心产品,而无需在定制后端技术上浪费精力。
Website:
https://www.subquery.network/
Discord中文群:
https://discord.gg/ysdwnUSTQC
Telegram中文群:
t.me/subquerychina
Mixin中文群:
https://subquery.mixinbots.com/join
往期精彩
《SubQuery 入门开发 | 第六课:如何在SubQuery项目中进行性能调优》
《SubQuery 入门开发 | 第五课:SubQuery 索引 Moonbeam EVM 实战》
《SubQuery 入门开发 | 第三课:SubQuery 映射之事件和外部信息处理》
《SubQuery入门开发 | 第二期:SubQuery项目结构及区块处理》
《SubQuery入门开发 | 第一期:SubQuery简介与如何使用docker启动项目》
《SubQuery与OneBlock+共同打造首个区块链数据索引开发课!》
《SubQuery开发者指南丨了解有关GraphQL的更多信息》
《SubQuery开发者指南丨如何连接SubQuery的新项目》
《SubQuery开发者指南丨如何部署SubQuery项目新版本》
《SubQuery开发者指南丨在本地运行 SubQuery》
《SubQuery开发者指南丨GraphQL 架构(GraphQL Schema)》
《SubQuery开发者指南丨Hello World Explained》
《SubQuery开发者指南丨Hello World (由SubQuery 托管)》
《SubQuery开发者指南丨创建一个SubQuery项目》
《SubQuery开发者指南丨清单文件(Manifest File)》