It is quite often that certain arguments are logically connected. For example, a list of articles [Article]
can be filtered by lang
, userId
and rating
fields and sized using limit
field. It is not advisable to have those arguments on the same level:
Instead of having arguments on the same level group them. For example, arguments related to filtering can be grouped into filter
argument of ArticleFilter
type:
type Query {
articles(filter: ArticleFilter, limit: Int): [Article!]!
}
input ArticleFilter {
lang: String
userId: Int
rating: MinMaxInput
}
input MinMaxInput {
min: Int
max: Int
}
The same rule applies to fields within input types. Consider filtering by rating
field. Instead of two separate arguments ratingMin
and ratingMax
, a new input-type MinMaxInput
is introduced.
By grouping related arguments into sub-types the schema is easier to comprehend and ready to be extended in the future.