2017-07-21 9 views
2

私は、同じコンポーネントに両方とも必要な2つのオブジェクトを照会しています。問題は、一方のクエリが他方のクエリを待機し、他方の引数としてそのフィールドのidを使用することです。これを実装する方法がわかりません。GraphQLは、別のクエリの変数としてフィールド値を使用します。

const PlayerQuery = gql`query PlayerQuery($trackId: Int!, $duration: Int!, $language: String!) { 
    subtitle(trackId: $trackId, duration: $duration) { 
    id, 
    lines { 
     text 
     time 
    } 
    } 
    translation(trackId: $trackId, language: $language, subtitleId: ???) { 
    lines { 
     translation 
     original 
    } 
    } 
}`; 

だからtranslation上記のクエリでsubtitleクエリによって返される引数としてsubtitleIdを必要とします。
私はクライアントとサーバーの両方でApolloを使用しています。

+0

私はGraphQLを始めたばかりですが、私が理解しているところからは、それは不可能です。スキーマ内の 'subtitle'や' lines'タイプから 'translation'が参照された場合、リゾルバは' subtitle'オブジェクトを受け取るため、おそらく_可能なはずです。 – robertklep

答えて

5

これは、REST/RPCスタイルのAPIとGraphQLの間に大きな違いがあることを示しているため、大きな疑問です。 RESTスタイルAPIでは、返されるオブジェクトにはより多くのデータをフェッチする方法に関するメタデータしか含まれていないため、APIコンシューマはこれらのテーブルに対してJOINを実行する方法を知っている必要があります。あなたの例では、subtitletranslationがあり、IDプロパティを使用してJOINする必要があります。 GraphQLでは、オブジェクトは孤立して存在することはほとんどなく、スキーマ自体にエンコードされた関係も存在します。

あなたはschemaを投稿しませんでしたが、その外見から、translationオブジェクトとsubtitleオブジェクトを作成し、それらの両方をルートクエリに公開しました。私の推測では、それはこのようなものになりますことをされています。あなたの代わりに何をすべき

const Translation = new GraphQLObjectType({ 
    name: "Translation", 
    fields: { 
    id: { type: GraphQLInt }, 
    lines: { type: Lines } 
    } 
}); 

const SubTitle = new GraphQLObjectType({ 
    name: "SubTitle", 
    fields: { 
    lines: { type: Lines } 
    } 
}); 

const RootQuery = new GraphQLObjectType({ 
    name: "RootQuery", 
    fields: { 
    subtitle: { type: SubTitle }, 
    translation: { type: Translation } 
    } 
}); 

module.exports = new GraphQLSchema({ 
    query: RootQuery 
}); 

を、このような字幕の翻訳INSIDEに関係を作ることです。 GraphQLの目標は、まずデータ内にグラフや関係を作成し、そのデータにエントリポイントを公開する方法を理解することです。 GraphQLでは、グラフ内の任意のサブツリーを選択できます。

const Translation = new GraphQLObjectType({ 
    name: "Translation", 
    fields: { 
    id: { type: GraphQLInt }, 
    lines: { type: Lines } 
    } 
}); 

const SubTitle = new GraphQLObjectType({ 
    name: "SubTitle", 
    fields: { 
    lines: { type: Lines } 
    translations: { 
     type: Translation, 
     resolve:() => { 
     // Inside this resolver you should have access to the id you need 
     return { /*...*/ } 
     } 
    } 
    } 
}); 

const RootQuery = new GraphQLObjectType({ 
    name: "RootQuery", 
    fields: { 
    subtitle: { type: SubTitle } 
    } 
}); 

module.exports = new GraphQLSchema({ 
    query: RootQuery 
}); 

注:わかりやすくするために、引数フィールドと追加のリゾルバは省略しました。あなたのコードはもう少し洗練されたものになると確信しています。

+0

私の疑惑を確認し、適切な答えを提供してくれてありがとう:) – robertklep

+0

これは正解であることを確認するためにチェックマークをクリックすることができますか?あなたはちょうどそれをupvoted(私も感謝):)。 – Baer

+0

私は質問をしている人ではなかったので、私はできません:) – robertklep

関連する問題