2016-04-29 9 views
3

私はJavascriptを初めて使用しています。この問題の解決方法はわかりません。私は3つのタイプを定義したいと思い、データベースにクエリを提供するために、GraphQLサービスを作成しています:人、会社との関係をGraphQLコードのJavaScript循環依存性

type Relation: { 
    person: Person 
    company: Company 
} 

type Person: { 
    relationship: Relation 
} 

type Company: { 
    relationship: Relation 
} 

をあなたが見ることができるように、それらが相互に依存している、私は人と会社undefinedを得ますこれを解決する方法はありますか?あなたが必要と

// -------------------- Object(company) -------------------- 
objectType = new GraphQLObjectType ({ 
    name: 'Object', 
    description: 'Object could be a Company, FinancialOrg, Person or Product.', 
    fields: { 
    id: { 
     type: new GraphQLNonNull(GraphQLString), 
    }, 
    entity_type: { 
     type: new GraphQLNonNull(GraphQLString), 
     description: 'could be Company, FinancialOrg, Person or Product.' 
    }, 
    entity_id: { 
     type: new GraphQLNonNull(GraphQLInt), 
    }, 
    parent_id: { 
     type: GraphQLString, 
    }, 
    name: { 
     type: new GraphQLNonNull(GraphQLString), 
    }, 
    normalized_name: { 
     type: new GraphQLNonNull(GraphQLString), 
    }, 
    permalink: { 
     type: new GraphQLNonNull(GraphQLString), 
    } 
    }, 
    resolveType: function(object) { 
    return dbHandler.findObjectById(object.id); 
    } 
}) 

// -------------------- Relationship -------------------- 
var relationshipType = new GraphQLObjectType({ 
    name: 'Relationship', 
    description: 'Describe the relationship between a person and a object(Corporation, fund)', 
    fields: { 
    id: { 
     type: new GraphQLNonNull(GraphQLInt), 
    }, 
    relationship_id: { 
     type: new GraphQLNonNull(GraphQLInt), 
    }, 
    person_object_id: { 
     type: new GraphQLNonNull(GraphQLString), 
    }, 
    relationship_object_id: { 
     type: new GraphQLNonNull(GraphQLString), 
     description: 'A Corporation or a Fund', 
    }, 
    } 
}); 

// -------------------- Person Type -------------------- 
personType = new GraphQLObjectType ({ 
    name: 'Person', 
    fields: { 
    id: { 
     type: new GraphQLNonNull(GraphQLInt), 
    }, 
    object_id: { 
     type: new GraphQLNonNull(GraphQLString), 
    }, 
    first_name: { 
     type: new GraphQLNonNull(GraphQLString), 
    }, 
    last_name: { 
     type: new GraphQLNonNull(GraphQLString), 
    }, 
    birthplace: { 
     type: GraphQLString 
    }, 
    affiliation_name: { 
     type: GraphQLString 
    }, 
    }, 
}); 
+0

タイプを異なる方法でモデル化することは可能かもしれません。あなたのデータベーススキーマの様子の詳細を教えてください。 –

+0

ありがとうございます@AhmadFerdousBinAlam私はこれを解決する方法を理解しています、私は実際にすべての3つのタイプの関係、人と会社のリンクを解除したが、 '関係'内の3つのより複雑なバージョンで別の層を作成しました。 – Yechen

+0

私は自分のプロジェクトでこの問題を抱えていました。答えはGraphQLに 'Interfaces'を使うことです。 http://graphql.org/docs/api-reference-type-system/#graphqlinterfacetype – Chris

答えて

3

通常、特別なリレーションシップタイプは定義しません。 GraphQLでは、タイプ間の関係はタイプ自体で定義されます。

例として、personTypeには、companiesというフィールドがあります。このフィールドは、その人物の一部である企業のリスト(companyType)に解決されます。 companyTypeでは、同様にpeopleというフィールドを定義して、personTypeのリストに解決することができます。

これは、基本的に、データベースに定義されているような2つのタイプ間の多対多の関係を提供します。

このスタイルでpersonTypeは、次のようになります。循環依存関係の問題については

personType = new GraphQLObjectType ({ 
    name: 'Person', 
    fields:() => ({ 
    id: { 
     type: new GraphQLNonNull(GraphQLInt), 
    }, 
    companies: { 
     type: new GraphQLList(companyType), 
     resolve: person => dbHandler.getAssociatedCompanies(person.id), 
     }, 
    }, 
    }), 
}); 

を、むしろfieldsため、オブジェクトリテラルを使用するよりもそれ以上の通知、あなたの代わりにオブジェクトを返す関数を使用することができ、その(あなたのリンターは文句を言うかもしれませんが)問題を引き起こすことはありません。

GraphQL Typesも読んで、あなたのフィールドに適切なタイプを選択してください。十分に快適になったら、GraphQLInterfaceTypeを調べて、他のタイプの実装できる共通フィールドを定義することができます。最終的には、型を別々に定義して、汎用のobjectTypeではなくインタフェースを実装する方がよいでしょう。

また、resolveTypeは、おそらくあなたが思うとは思わないことに注意してください。 GraphQL Typesから: "[resolveTypeは]フィールドが解決されたときに実際にどの型が使われるかを決める関数です。"あなたは、GraphQLInterfaceTypeGraphQLUnionTypeのような複数のタイプで構成できるGraphQLの型を参照してください。

Star Wars exampleは私がこのようなものの周りを頭で覆うのを助けました。

0

は、データベーススキーマでは、この

type Person: { 
    employers: [Company], 
    ...personAttributes 
} 

type Company: { 
    employees: [Person], 
    ...companyAttributes 
} 

ような何かにあなたのGraphQLエンドポイントを再構築してみてください(私はあなたがリレーショナルデータベースを使用していると思います):

データベーススキーマ3つのテーブル:

  • 企業
  • 関係

This article explains how to model many-to-many relationships like the one you have.

注:1人は一度に一つの会社で働くことができた場合は、スキーマがはるかに簡単です。