如何通过GraphQL筛选GitHub项目中已关闭状态的卡片?
解决GitHub项目中用GraphQL筛选已关闭Issue卡片的问题
我明白你遇到的痛点——因为Project Cards是UNION类型,没法直接在顶层加筛选条件,得用GitHub GraphQL里的**内联片段(inline fragments)**或者针对Project V2的专属筛选参数来处理,下面分两种情况给你具体方案:
如果你用的是GitHub Project V2(新版项目)
新版Project的API设计更友好,直接在items的filter参数里就能指定内容类型和状态,不用绕弯子。比如下面这个查询,就能直接拉取项目中所有已关闭的Issue卡片:
query GetClosedIssueProjectCards { repository(owner: "你的用户名", name: "你的仓库名") { projectV2(number: 1) { # 替换成你的项目编号 items( first: 20 # 可调整返回数量 filter: { content: { type: ISSUE state: CLOSED } } ) { nodes { id content { ... on Issue { title number state closedAt } } } } } } }
原理很简单:filter.content.type先锁定我们要的是Issue类型,再通过state: CLOSED筛选已关闭的卡片,完美避开UNION类型的限制。
如果你用的是旧版GitHub Project(V1)
旧版的Project Card API没有直接的筛选参数,这时候就得靠内联片段来针对性过滤。你可以在查询content时,只对Issue类型提取字段,并且后续可以在客户端或者结合搜索来筛选已关闭状态:
方案1:直接查询卡片并过滤
query GetOldProjectClosedIssues { repository(owner: "你的用户名", name: "你的仓库名") { project(number: 1) { # 替换成旧版项目编号 columns(first: 10) { nodes { cards(first: 10) { nodes { content { ... on Issue { title number state } } } } } } } } }
拿到结果后,你只需要在本地过滤state为CLOSED的条目就行。
方案2:用搜索API更高效
如果项目卡片很多,本地过滤效率低,推荐用GitHub的搜索查询,直接定位到仓库里属于该项目的已关闭Issue:
query SearchClosedIssuesInOldProject { search( query: "repo:你的用户名/你的仓库名 is:issue is:closed project:1", # project:后面是旧版项目编号 type: ISSUE, first: 20 ) { nodes { ... on Issue { title number state projectCards(first: 5) { nodes { column { name } } } } } } }
关键知识点回顾
UNION类型的核心限制是:你不能直接在UNION字段上添加只有某种子类型才有的字段(比如Issue的state),必须用... on 子类型的语法,明确指定要处理的类型后,才能使用该类型专属的字段和筛选条件。
内容的提问来源于stack exchange,提问作者berto
相关产品推荐
相关产品推荐

