0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Keystonejs Tutorials #4/Creating relationships

Last updated at Posted at 2020-05-04

前ページ 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つの別々の片側関係を作成したためです。私たちが望むのは、単一の両面関係です。

スクリーンショット 2020-05-04 11.05.21.png

(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

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?