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

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

2025-05-14 03:12:10作者:滑思眉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,同时保持代码的整洁和一致性。

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

热门内容推荐

项目优选

收起
wechat-botwechat-bot
🤖一个基于 WeChaty 结合 DeepSeek / ChatGPT / Kimi / 讯飞等Ai服务实现的微信机器人 ,可以用来帮助你自动回复微信消息,或者管理微信群/好友,检测僵尸粉等。
JavaScript
182
22
unibestunibest
unibest - 最好用的 uniapp 开发框架。unibest 是由 uniapp + Vue3 + Ts + Vite5 + UnoCss + WotUI 驱动的跨端快速启动模板,使用 VS Code 开发,具有代码提示、自动格式化、统一配置、代码片段等功能,同时内置了大量平时开发常用的基本组件,开箱即用,让你编写 uniapp 拥有 best 体验。
TypeScript
26
2
RuoYi-Vue3RuoYi-Vue3
🎉 (RuoYi)官方仓库 基于SpringBoot,Spring Security,JWT,Vue3 & Vite、Element Plus 的前后端分离权限管理系统
Vue
791
484
Cangjie-ExamplesCangjie-Examples
本仓将收集和展示高质量的仓颉示例代码,欢迎大家投稿,让全世界看到您的妙趣设计,也让更多人通过您的编码理解和喜爱仓颉语言。
Cangjie
321
1.05 K
奥升充电桩平台orise-charge-cloud奥升充电桩平台orise-charge-cloud
⚡️充电桩Saas云平台⚡️完整源代码,包含模拟桩模块,可通过docker编排快速部署测试。技术栈:SpringCloud、MySQL、Redis、RabbitMQ,前后端管理系统(管理后台、小程序),支持互联互通协议、市政协议、一对多方平台支持。支持高并发业务、业务动态伸缩、桩通信负载均衡(NLB)。
Java
35
15
ruoyi-airuoyi-ai
RuoYi AI 是一个全栈式 AI 开发平台,旨在帮助开发者快速构建和部署个性化的 AI 应用。
Java
165
45
uniapp-shop-vue3-tsuniapp-shop-vue3-ts
小兔鲜儿-vue3+ts-uniapp 项目已上线,小程序搜索《小兔鲜儿》即可体验。🎉🎉🎉 <br/> 配套项目接口文档,配套笔记。
TypeScript
19
1
ohos_react_nativeohos_react_native
React Native鸿蒙化仓库
C++
160
249
HarmonyOS-ExamplesHarmonyOS-Examples
本仓将收集和展示仓颉鸿蒙应用示例代码,欢迎大家投稿,在仓颉鸿蒙社区展现你的妙趣设计!
Cangjie
383
366
cherry-studiocherry-studio
🍒 Cherry Studio 是一款支持多个 LLM 提供商的桌面客户端
TypeScript
563
48