14

簡単なことだと思いますが、GraphQL のドキュメントや Graphcool のドキュメントには何も見つかりませんでした。

このスキーマを持つエンティティがあるとします (GraphQL の新しいユーザーです。スキーマ表現を間違えたらごめんなさい)。

Book {
  name: String!
  author: String!
  categories: [String!]
}

"mystery"カテゴリの一部であるすべての本に対してクエリを実行するにはどうすればよいですか? でフィルタリングできることはわかっていますallBooks(filter: {})categories_in: ["mystery"]、うまくいきcategories_contains: "mystery"ませんでした。

4

2 に答える 2

11

Categoryモデル

この状況についてもう少し考えてみると、Categoryモデルを作成することは間違いなく進むべき道です。

たとえば、読者がお気に入りのカテゴリを後で購読できるようにしたいとします。または、既存のすべてのカテゴリのリストが必要な場合はどうしますか? 文字列リストを使用すると、すべての本を照会し、何らかの形で取得したすべてのカテゴリを後処理する必要があります。文字列リストを使用するのではなく、モデル レベルでこれを処理する方がはるかに自然に感じられます。

代わりに、新しいモデルを作成して、と の間にCategory多対多の関係を追加できます。このような状況では、一意の列挙フィールドと文字列フィールドを追加するのが好きです。(一意の文字列フィールドだけでも適切ですが、おそらく好みの問題です。)CategoryBooktagtexttag

この設定により、次のようなデータ要件を簡単に満たすことができます。

特定のカテゴリに割り当てられている書籍は?

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
  }
}
于 2017-01-10T17:10:48.093 に答える
1

ホストされた GraphQL サービスの使用に興味がある場合、scaphold.ioにはこの機能がしばらく前からありました。API のすべての接続フィールドにはWhereArgs、データを実際に掘り下げることができるフィルターを公開する引数が付属しています。このようなスカラーのリストがある場合、WhereArgs には、リストの値に基づいて結果をフィルター処理できるcontains&フィールドが含まれます。notContainsこれにより、このようなクエリを作成できます。

query MysteriousBooks($where:BookWhereArgs) {
  viewer {
    allBooks(where:$where) {
      edges { node { title, ... } }
    }
  }
}

# Variables
{
  "where": {
    "categories": {
      "contains": "mystery"
    }
  }
}

完全にするために、スカラー リストでフィルター処理することなく、これを機能させるためにスキーマをわずかに再調整することもできます。たとえば、Categoryタイプを実装するノードを作成し、 と の間の接続を作成できCategoryますBook。にBookは多くのカテゴリが含まれていない可能性がありますが、これにより、次のようなクエリを発行できます。

query MysteriousBooks($where: CategoryWhereArgs) {
  viewer {
    allCategories(where: $where) {
      books {
        edges { node { title, ... } }
      }
    }
  }
}

# Variables
{
  "where": { 
    "name": { 
      "eq": "mystery" 
    } 
  }
}

このようにスキーマを構成すると、アーカイブ内のすべての本をループすることなく、カテゴリ内の本をさらにフィルタリングすることもできます。例えば、「昨年書かれたすべてのミステリー本」を効率的に求めることができます。

完全な開示: 私は Scaphold で働いています。ぜひ試してみていただきたいのですが、切り替えなくても問題ありません。人々が GraphQL を試し、愛用しているのを見るのが楽しみです。この種の動作を自分のサーバーに実装する方法に興味がある場合は、お知らせください。喜んでお手伝いさせていただきます。

これが役立つことを願っています!

于 2017-01-09T10:05:58.083 に答える