如何在棱镜查询中创建嵌套连接?
How to create nested connection in prisma query?
我在让 prisma/graphql-yoga 客户端按预期工作时遇到问题。
我正在尝试创建在两个节点(Game
和 User
)之间创建连接的突变查询,但突变的行为并不像我预期的那样。
这是我正在使用的系统:
node --version
v11.6.0
package.json
{
"dependencies": {
"graphql-yoga": "^1.17.0",
"prisma-client-lib": "^1.25.3"
},
...
}
docker-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()
}
因为您使用的是 prisma-client
,您必须为连接 (Documentation) 编写解析器:
Game: {
playerOne: (root, args, ctx) => ctx.prisma.game({id: root.id}).playerOne()
}
我在让 prisma/graphql-yoga 客户端按预期工作时遇到问题。
我正在尝试创建在两个节点(Game
和 User
)之间创建连接的突变查询,但突变的行为并不像我预期的那样。
这是我正在使用的系统:
node --version
v11.6.0
package.json
{
"dependencies": {
"graphql-yoga": "^1.17.0",
"prisma-client-lib": "^1.25.3"
},
...
}
docker-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()
}
因为您使用的是 prisma-client
,您必须为连接 (Documentation) 编写解析器:
Game: {
playerOne: (root, args, ctx) => ctx.prisma.game({id: root.id}).playerOne()
}