Keystonejs Tutorials #6/Creating relationships3

前ページ https://qiita.com/bontensuzuki/items/7f306f0d6bed05adc891
次ページ https://qiita.com/bontensuzuki/items/8f91e3f0128b6be1ecbb

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

###多対多の関係(To-many relationship)
ユーザーが複数のタスクを実行できる必要がある場合はどうなりますか？ Keystoneはこれを簡単に行う方法を提供します。 User.jsの次のコードを見てください。

/lists/User.js


```javascript

tasks: {
  type: Relationship,
  ref: 'Todo.assignee',
  many: true,
}
```
many：trueオプションは、ユーザーがタスクへの複数の参照を保存できることを示します。

/lists/Todo.js


```javascript

assignee: {
  type: Relationship,
-  ref: 'User.task',
+  ref: 'User.tasks',
}
```



>
注：フィールドの名前をtaskからtasksに更新し、関係の性質を示しました。

![スクリーンショット 2020-05-04 15.25.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30363/8b0314bb-96ab-6cba-2267-fed7e6ebf126.png)

taskが２つ登録できました

<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.tasks',
    isRequired: true,
    },
  },
};
```
</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,
    },
    tasks: {
      type: Relationship,
      ref: 'Todo.assignee',
      many: true,
      },
    },
};
```
</div></details>

前ページ https://qiita.com/bontensuzuki/items/7f306f0d6bed05adc891
次ページ https://qiita.com/bontensuzuki/items/8f91e3f0128b6be1ecbb