Как создать вложенное соединение в призме запроса? - PullRequest
0 голосов
/ 25 января 2019

У меня проблемы с тем, чтобы клиент prisma / graphql-yoga работал так, как я ожидал.

Я пытаюсь создать запрос на мутацию, который создает соединение между двумя узлами (Game и User), но мутация ведет себя не так, как я ожидаю.

Вот система, в которой я работаю:

node --version
v11.6.0

package.json

{
  "dependencies": {
    "graphql-yoga": "^1.17.0",
    "prisma-client-lib": "^1.25.3"
  },
  ...
}

докер-compose.yml

version: '3'
services:
  prisma:
    image: prismagraphql/prisma:1.25
    restart: always
    ports:
    - "4466:4466"
    environment:
      PRISMA_CONFIG: |
        port: 4466
        databases:
          default:
            connector: postgres
            host: postgres
            port: 5432
            user: prisma
            password: prisma
            migrations: true
  postgres:
    image: postgres:10.5
    restart: always
    environment:
      POSTGRES_USER: prisma
      POSTGRES_PASSWORD: prisma
    volumes:
      - postgres:/var/lib/postgresql/data
volumes:
  postgres:

Вот файл datamodel.prisma:

type Game {
  id: ID! @unique
  createdAt: DateTime!
  updatedAt: DateTime!
  board: String
  playerOne: User
}

type User {
  id: ID! @unique
  createdAt: DateTime!
  wins: Int
}

Вот мутация, которую я посылаю:

mutation {
  createGame(userId: "cjraz4ogb000s0894lbrugksi") {
    id
    board
    playerOne {
      id
    }
  }
}

Вот решатель:

async function createGame(parent, args, context, info) {
  const game = await context.prisma.createGame({
    playerOne: { connect: { id: args.userId } },
    board: "[[]]"
  })
  return game
}

Как вы можете видеть в ответе, распознаватель создает объект Game, но с этой игрой не связано ни одного пользователя. Ниже показан ответ от мутации GraphQL:

{
  "data": {
    "createGame": {
      "id": "cjraz8iwr001e08940ok9luki",
      "board": "[[]]",
      "playerOne": null
    }
  }
}

Ответ, который я ожидаю, будет выглядеть примерно так:

{
  "data": {
    "createGame": {
      "id": "cjraz8iwr001e08940ok9luki",
      "board": "[[]]",
      "playerOne": {
        id: "cjraz8iwr001e08940ok9luki" <- id from above
      }
    }
  }
}

Решение

Так же, как упоминалось @Errorname, мне нужно было реализовать функцию распознавателя для отношения playerOne. Добавление строк кода ниже решило проблему.

function playerOne(parent, args, context, info) {
  return context.prisma.game({ id: parent.id }).playerOne()
}

1 Ответ

0 голосов
/ 25 января 2019

Поскольку вы используете prisma-client, вы должны написать преобразователь для соединения ( Документация ):

Game: {
  playerOne: (root, args, ctx) => ctx.prisma.game({id: root.id}).playerOne()
}
...