Keystonejs Tutorials #4/Creating relationships

前ページ https://qiita.com/bontensuzuki/items/670c97af7d0e55bbfe93
次ページ https://qiita.com/bontensuzuki/items/7f306f0d6bed05adc891

#Creating relationships
Keystonejsのtutorialsから学んでいきます。（ほとんど機械翻訳です）
https://www.keystonejs.com/tutorials/relationships



###関係を作る(Creating relationships)


1 新しいプロジェクトを作成する
2 リストを追加する

###単一の関係(To-single relationship)
関係を設定して、TodoリストとUserリストをリンクします。 Todo.jsの担当者フィールドを調整して、次のコードと一致させます。

Import the Relationship field:
/lists/Todo.js


```javascript

const { CalendarDay, Checkbox, Relationship, Text } = require('@keystonejs/fields');
```

フィールドタイプを[Text]から[Relationship]に更新し、フィールドが関連付けられているリストを指すrefを設定します。

```javascript

assignee: {
  type: Relationship,
  ref: 'User',
  isRequired: true,
```


refオプションは、関連するリストを定義します。オプションに割り当てられる名前は、createListに渡される名前と同じです。Admin UIで、作成したユーザーの1人を選択して、タスクを完了する責任を持たせることができます。



###双方向の単一関係(Two-way to-single relationship)

ユーザーにタスクを割り当てることができるようになりましたが、タスクにユーザーを割り当てることはできません。そこでUser.jsに次のフィールドを追加します。

/lists/User.js

```javascript

task: {
  type: Relationship,
  ref: 'Todo',
}
```


これで、管理パネルからユーザーのタスクを設定できます。
管理者を登録します

```javascript

mutation {
  createUser(data: { 
    username: "Sato",
    email:"test@test.test",
    isAdmin:true,
    password:"test12345"
  }) {
    id
  }
}
```

このあとで管理パネルでTODOを登録します


しかし、何かがおかしい！ユーザーのタスクを選択してからこのタスクを確認すると、担当者が正しくありません。これは、2つの別々の片側関係を作成したためです。私たちが望むのは、単一の両面関係です。



![スクリーンショット 2020-05-04 11.05.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30363/d012f639-1b70-e576-de89-bddec2301fd6.png)

(Assigneeの欄がUserIdで表示されています...)


<details><summary>index.js </summary><div>

```javascript
const { Keystone } = require('@keystonejs/keystone');
const { MongooseAdapter } = require('@keystonejs/adapter-mongoose');
const { PasswordAuthStrategy } = require('@keystonejs/auth-password');
const { GraphQLApp } = require('@keystonejs/app-graphql');
const { AdminUIApp } = require('@keystonejs/app-admin-ui');
const { Text, CalendarDay, Checkbox , Password} = require('@keystonejs/fields');
const TodoSchema = require('./lists/Todo.js');
const UserSchema = require('./lists/User.js');


const keystone = new Keystone({
  name: 'New Project 3',
  adapter: new MongooseAdapter(),
});

keystone.createList('Todo', TodoSchema);
keystone.createList('User', UserSchema);

const authStrategy = keystone.createAuthStrategy({
  type: PasswordAuthStrategy,
  list: 'User',
});

module.exports = {
  keystone,
  apps: [new GraphQLApp(),new AdminUIApp({ enableDefaultRoute: true, authStrategy })],
  
};
```
</div></details>
<details><summary> lists/Todo.js </summary><div>

```javascript
const { CalendarDay, Checkbox, Relationship, Text } = require('@keystonejs/fields');

module.exports = {
  fields: {
    // existing fields
    description: {
      type: Text,
      isRequired: true,
    },
    isComplete: {
      type: Checkbox,
      defaultValue: false,
    },
    // added fields
    deadline: {
      type: CalendarDay,
      format: 'Do MMMM YYYY',
      yearRangeFrom: '2019',
      yearRangeTo: '2029',
      isRequired: false,
      defaultValue: new Date().toISOString('YYYY-MM-DD').substring(0, 10),
    },
    assignee: {
    type: Relationship,
    ref: 'User',
    isRequired: true,
    },
  },
};
```javascript

</div></details>
<details><summary>lists/User.js </summary><div>

```javascript
const { Text, Password ,Checkbox,Relationship} = require('@keystonejs/fields');

module.exports = {
  fields: {
    username: {
      type: Text,
      isRequired: true,
    },
    email: {
      type: Text,
      isUnique: true,
    },
    isAdmin: { 
      type: Checkbox
    },
    password: {
      type: Password,
      isRequired: true,
    },
    task: {
      type: Relationship,
      ref: 'Todo',
      },
    },
};
```
</div></details>

前ページ https://qiita.com/bontensuzuki/items/670c97af7d0e55bbfe93
次ページ https://qiita.com/bontensuzuki/items/7f306f0d6bed05adc891