Category
モデル
この状況についてもう少し考えてみると、Category
モデルを作成することは間違いなく進むべき道です。
たとえば、読者がお気に入りのカテゴリを後で購読できるようにしたいとします。または、既存のすべてのカテゴリのリストが必要な場合はどうしますか? 文字列リストを使用すると、すべての本を照会し、何らかの形で取得したすべてのカテゴリを後処理する必要があります。文字列リストを使用するのではなく、モデル レベルでこれを処理する方がはるかに自然に感じられます。
代わりに、新しいモデルを作成して、と の間にCategory
多対多の関係を追加できます。このような状況では、一意の列挙フィールドと文字列フィールドを追加するのが好きです。(一意の文字列フィールドだけでも適切ですが、おそらく好みの問題です。)Category
Book
tag
text
tag
この設定により、次のようなデータ要件を簡単に満たすことができます。
特定のカテゴリに割り当てられている書籍は?
query {
# query books by unique category tag
Category(tag: MYSTERY) {
books {
id
}
}
# query books by specific category text
Category(filter: {
text: "mystery"
}) {
books {
id
}
}
}
特定のリストの少なくとも 1 つのカテゴリに割り当てられている本は?
query {
allCategories(filter: {
OR: [{
tag: MYSTERY
}, {
tag: MAGIC
}]
}) {
books {
id
}
}
}
特定のリストのすべてのカテゴリに割り当てられている本は?
query {
allCategories(filter: {
AND: [{
tag: MYSTERY
}, {
tag: MAGIC
}]
}) {
books {
id
}
}
}
関連フィルター
上記のクエリは指定されたデータ要件を満たしていますが、書籍はCategory
応答でグループ化されているため、クライアントでグループをフラット化する必要があります。
いわゆる関連フィルターを使用すると、関連カテゴリで定義された条件に基づいて書籍のみを取得するように方向転換できます。
たとえば、特定のリストの少なくとも 1 つのカテゴリに割り当てられた本をクエリするには、次のようにします。
query {
allBooks(filter: {
OR: [{
categories_some: {
tag: MYSTERY
},
categories_some: {
tag: MAGIC
}
}]
}) {
id
}
}