前ページ 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
const { CalendarDay, Checkbox, Relationship, Text } = require('@keystonejs/fields');
フィールドタイプを[Text]から[Relationship]に更新し、フィールドが関連付けられているリストを指すrefを設定します。
assignee: {
type: Relationship,
ref: 'User',
isRequired: true,
refオプションは、関連するリストを定義します。オプションに割り当てられる名前は、createListに渡される名前と同じです。Admin UIで、作成したユーザーの1人を選択して、タスクを完了する責任を持たせることができます。
###双方向の単一関係(Two-way to-single relationship)
ユーザーにタスクを割り当てることができるようになりましたが、タスクにユーザーを割り当てることはできません。そこでUser.jsに次のフィールドを追加します。
/lists/User.js
task: {
type: Relationship,
ref: 'Todo',
}
これで、管理パネルからユーザーのタスクを設定できます。
管理者を登録します
mutation {
createUser(data: {
username: "Sato",
email:"test@test.test",
isAdmin:true,
password:"test12345"
}) {
id
}
}
このあとで管理パネルでTODOを登録します
しかし、何かがおかしい!ユーザーのタスクを選択してからこのタスクを確認すると、担当者が正しくありません。これは、2つの別々の片側関係を作成したためです。私たちが望むのは、単一の両面関係です。
(Assigneeの欄がUserIdで表示されています...)
index.js
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 })],
};
lists/Todo.js
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',
},
},
};
前ページ https://qiita.com/bontensuzuki/items/670c97af7d0e55bbfe93
次ページ https://qiita.com/bontensuzuki/items/7f306f0d6bed05adc891