Firebase Dataconnect:使用隐式突变时如何返回更多数据?
问题描述
我在Schema中定义了如下Organization表类型:
type Organization @table { id: UUID! @default(expr: "uuidV4()") slug: String! @col(dataType: "varchar(255)") @unique @index name: String! @col(dataType: "varchar(200)") logo: String createdAt: Date! @default(expr: "request.time") updatedAt: Date! @default(expr: "request.time") owner: User! }
使用以下mutation创建新记录:
mutation CreateOrganization($name: String!, $slug: String, $logo: String) @auth(level: USER) { organization_insert( data: { name: $name slug: $slug ownerId_expr: "auth.uid" logo: $logo } ) }
但自动生成的dataconnect/.dataconnect/schema/main/mutation.gql中,该mutation仅返回id:
""" ✨ Insert a single `Organization` into the table. Columns not specified in `data` will receive defaults (e.g. `null`). """ organization_insert( """ Data object to insert into the table. """ data: Organization_Data! ): Organization_KeyOutput! @fdc_generated(from: "Organization", purpose: INSERT_SINGLE)
我希望这个mutation能返回除id外的更多字段(比如slug),不想创建后再额外查询,有没有更好的实现方法?
解决方案
有几种实用方法能实现需求,无需额外查询:
1. 自定义mutation替换自动生成版本
直接在自己的Schema里定义自定义mutation,指定返回完整的Organization类型,绕开自动生成的仅返回id的版本。示例代码:
mutation CreateOrganization($name: String!, $slug: String, $logo: String) @auth(level: USER) @sql( statement: """ INSERT INTO "Organization" ("name", "slug", "ownerId", "logo", "createdAt", "updatedAt") VALUES ($name, $slug, auth.uid(), $logo, request.time(), request.time()) RETURNING "id", "slug", "name", "logo", "createdAt", "updatedAt" """ ) { organization_insert: Organization! }
通过@sql注解直接编写带RETURNING子句的SQL,把需要的字段都列在RETURNING后,mutation执行后就能一次性拿到所有目标数据。
2. 自定义输出类型覆盖默认(需版本支持)
如果你的Data Connect版本支持,可自定义包含所需字段的输出类型,让mutation返回该类型:
# 定义包含所有需要字段的输出类型 type Organization_FullOutput { id: UUID! slug: String! name: String! logo: String createdAt: Date! updatedAt: Date! } # 修改mutation,指定使用自定义输出类型 mutation CreateOrganization($name: String!, $slug: String, $logo: String) @auth(level: USER) @fdc_generated(from: "Organization", purpose: INSERT_SINGLE, outputType: "Organization_FullOutput") { organization_insert( data: { name: $name slug: $slug ownerId_expr: "auth.uid" logo: $logo } ): Organization_FullOutput! }
注意:这种方法依赖Data Connect版本是否支持outputType注解参数,不支持的话还是用自定义SQL更稳妥。
3. 配置表的默认返回字段(需查工具文档)
部分Data Connect工具允许在表类型定义时配置默认返回字段,可尝试在@table注解中添加相关参数,让自动生成的insert mutation默认返回更多字段。不过这个需要查阅对应工具的官方文档确认是否支持。
内容的提问来源于stack exchange,提问作者codercatdev
相关产品推荐
相关产品推荐

