首页
/ Ent框架中GraphQL突变操作的字段排除技巧

Ent框架中GraphQL突变操作的字段排除技巧

2025-05-14 00:52:38作者:滑思眉Philip

概述

在使用Ent框架的GraphQL生成工具时,开发者经常会遇到需要从突变(Mutation)操作中排除某些字段的需求。这些字段通常是用于系统内部管理的元数据字段,如创建时间(created_at)、更新时间(updated_at)和ID等,它们应该由系统自动维护而不允许通过API直接修改。

常见场景

在实际开发中,我们经常会定义一些基础字段作为Mixin混入到多个实体中。这些字段包括:

  • 创建时间(create_time):记录数据创建时间戳
  • 更新时间(update_time):记录最后更新时间戳
  • ID:唯一标识符

这些字段通常具有以下特点:

  1. 创建时间在记录创建时自动设置为当前时间,之后不可更改
  2. 更新时间在记录创建和每次更新时自动设置为当前时间
  3. ID由系统自动生成,不允许修改

解决方案

Ent框架提供了entgql.Skip注解来优雅地解决这个问题。开发者可以通过这个注解精确控制哪些字段应该从GraphQL的突变输入类型中排除。

基本用法

在字段定义中添加entgql.Skip注解,并指定要跳过的突变类型:

field.Time("create_time").
    Default(time.Now).
    Immutable().
    Annotations(
        entgql.Skip(entgql.SkipMutationCreateInput|entgql.SkipMutationUpdateInput),
        entgql.OrderField("CREATE_TIME"),
    ),

在Mixin中使用

对于混入多个实体的公共字段,可以在Mixin中统一配置:

func (CommonMixin) Fields() []ent.Field {
    return []ent.Field{
        field.Time("create_time").
            Default(time.Now).
            Immutable().
            Annotations(
                entgql.Skip(entgql.SkipMutationCreateInput|entgql.SkipMutationUpdateInput),
                entgql.OrderField("CREATE_TIME"),
            ),
        field.Time("update_time").
            Default(time.Now).
            UpdateDefault(time.Now).
            Immutable().
            Annotations(
                entgql.Skip(entgql.SkipMutationCreateInput|entgql.SkipMutationUpdateInput),
                entgql.OrderField("UPDATE_TIME"),
            ),
        field.UUID("id", uuid.Nil).
            Default(UUIDV7DefaultFn).
            Immutable().
            Annotations(
                entgql.Skip(entgql.SkipMutationCreateInput|entgql.SkipMutationUpdateInput),
            ),
    }
}

使用mixin.AnnotateFields

对于已经定义好的Mixin,可以使用mixin.AnnotateFields来添加注解:

func (T) Mixin() []ent.Mixin {
    return []ent.Mixin{
        mixin.AnnotateFields(
            mixin.Time{},
            entgql.Skip(entgql.SkipMutationCreateInput|entgql.SkipMutationUpdateInput),
        ),
    }
}

注意事项

  1. 使用entgql.Skip只会从突变输入类型中排除字段,不会影响查询和排序功能
  2. sensitive注解不同,被跳过的字段仍然会在查询结果中可见
  3. 建议同时使用Immutable()来确保这些字段在业务逻辑层也无法被修改
  4. 对于ID字段,除了跳过突变外,还应该设置合适的默认值生成函数

最佳实践

  1. 将公共字段集中定义在Mixin中统一管理
  2. 为时间戳字段设置合适的默认值和更新逻辑
  3. 同时使用Immutable和Skip注解提供双重保护
  4. 为排序常用的字段添加OrderField注解
  5. 在文档中明确说明这些系统字段的行为

通过合理使用entgql.Skip注解,开发者可以构建出更加健壮和安全的GraphQL API,同时保持代码的整洁和一致性。

登录后查看全文
热门项目推荐

项目优选

收起
docsdocs
OpenHarmony documentation | OpenHarmony开发者文档
Dockerfile
118
1.88 K
kernelkernel
deepin linux kernel
C
22
6
Cangjie-ExamplesCangjie-Examples
本仓将收集和展示高质量的仓颉示例代码,欢迎大家投稿,让全世界看到您的妙趣设计,也让更多人通过您的编码理解和喜爱仓颉语言。
Cangjie
341
1.24 K
ohos_react_nativeohos_react_native
React Native鸿蒙化仓库
C++
192
271
RuoYi-Vue3RuoYi-Vue3
🎉 (RuoYi)官方仓库 基于SpringBoot,Spring Security,JWT,Vue3 & Vite、Element Plus 的前后端分离权限管理系统
Vue
912
546
openHiTLSopenHiTLS
旨在打造算法先进、性能卓越、高效敏捷、安全可靠的密码套件,通过轻量级、可剪裁的软件技术架构满足各行业不同场景的多样化要求,让密码技术应用更简单,同时探索后量子等先进算法创新实践,构建密码前沿技术底座!
C
377
388
openGauss-serveropenGauss-server
openGauss kernel ~ openGauss is an open source relational database management system
C++
143
188
nop-entropynop-entropy
Nop Platform 2.0是基于可逆计算理论实现的采用面向语言编程范式的新一代低代码开发平台,包含基于全新原理从零开始研发的GraphQL引擎、ORM引擎、工作流引擎、报表引擎、规则引擎、批处理引引擎等完整设计。nop-entropy是它的后端部分,采用java语言实现,可选择集成Spring框架或者Quarkus框架。中小企业可以免费商用
Java
8
0
金融AI编程实战金融AI编程实战
为非计算机科班出身 (例如财经类高校金融学院) 同学量身定制,新手友好,让学生以亲身实践开源开发的方式,学会使用计算机自动化自己的科研/创新工作。案例以量化投资为主线,涉及 Bash、Python、SQL、BI、AI 等全技术栈,培养面向未来的数智化人才 (如数据工程师、数据分析师、数据科学家、数据决策者、量化投资人)。
Jupyter Notebook
68
58
harmony-utilsharmony-utils
harmony-utils 一款功能丰富且极易上手的HarmonyOS工具库,借助众多实用工具类,致力于助力开发者迅速构建鸿蒙应用。其封装的工具涵盖了APP、设备、屏幕、授权、通知、线程间通信、弹框、吐司、生物认证、用户首选项、拍照、相册、扫码、文件、日志,异常捕获、字符、字符串、数字、集合、日期、随机、base64、加密、解密、JSON等一系列的功能和操作,能够满足各种不同的开发需求。
ArkTS
81
2