让我们认为我正在建立一个博客网站。该网站具有博客文章和类别,每个文章可以与一个或多个类别相关联。
type Category {
id: Int!
name: String!
}
type Post {
id: Int!
title: String!
categories: [Category]!
}
我的网站需要提供两种用户界面-一种用于撰写帖子的作者,另一种用于读者。
阅读器的用户界面非常简单,它显示了标题,内容以及与该帖子相关的类别的列表。
作者的UI稍微复杂一些,它可能包括一些输入,发布按钮,用于内容的富文本编辑器以及我特别感兴趣的内容-复选框列表,用于将帖子与某些内容相关联像这样的全球可用类别
<ul>
<li>
<input type="checkbox" checked="true"> Art
</li>
<li>
<input type="checkbox"> Kitchen
</li>
<li>
<input type="checkbox"> Garden
</li>
</ul>
它显示了全球可用类别的列表,然后作者可以勾选复选框,并将帖子与所选类别相关联。创建帖子以及对其进行编辑时将显示此UI。
我可能有这种模式来获取帖子和类别
type Query {
post: Post
categories: [Category!]!
}
但是,如果我正在编辑帖子,则必须在UI中至少进行一些数据转换/循环,以找出哪些类别已被选择,哪些类别未被选择。
我正在构建的应用程序在许多不同的地方都需要这样做,因此我需要一个好的模式来解决此问题,以便于管理。
经过一段时间,我得出的结论是我也许可以做类似的事情
type Category {
id: Int!
name: String!
}
type PostCategoryEdge {
selected: Boolean!
node: Category!
}
# It uses a connection type, because I might need pagination
# or filtering, if I have many entities
type PostCategoryConnection {
edges: [PostCategoryEdge!]!
}
type Post {
id: Int!
title: String!
categories: PostCategoryConnection!
}
这在某种程度上解决了我的问题-类别现在不仅包含关联的类别,而且还包含全球可用类别的列表,并且关联的类别将selected
属性设置为true。
这样,我可以直接在边缘类型上对所选属性进行建模,并且当用户提交更改时,我可以执行过滤器/映射以检索所选边缘的ID,并将其添加到突变中。
这是可行的解决方案吗?此外,对于读者的UI,我的Categories属性现在也不太有用。如果我只想显示选定的类别,则需要在Post模式中添加一个过滤器,例如selectedOnly
或另一个属性。如果我的架构通常面向中继规范,那么应该使用哪种命名约定更好?
我使用的是PostCategoryConnection
而不是CategoryConnection
,因为selected
属性仅在从帖子上下文中查询时才有意义,而不是整体上(我可能会有CategoryConnection
查询中使用的categories
是否有更好的解决方案,与上面描述的完全不同?