Prisma2:在创建函数中使用相关 table 中的用户 ID
Prisma2: use user id in related table in create function
我正在尝试创建一个用户,该用户是另一个用户的 child。我通过拥有一个用户 table 来管理这种关系,其中存储了所有用户 parents 和 children。有一个单独的 table,它只有 child 的 ID 和 parent 的 ID。
我的问题是,当我创建一个 child 帐户时,我想使用将要创建的用户 ID 在 Relationship
table 中创建一个条目。我完全不确定我应该怎么做。
// schema.sql
CREATE TABLE "public"."Relationship" (
id SERIAL PRIMARY KEY NOT NULL,
parent_id INT NOT NULL,
FOREIGN KEY (parent_id) REFERENCES "User" (id),
child_id INT NOT NULL,
FOREIGN KEY (child_id) REFERENCES "User" (id)
)
CREATE TABLE "public"."User" (
id SERIAL PRIMARY KEY NOT NULL,
name VARCHAR(128) NOT NULL,
email VARCHAR(128) UNIQUE,
password VARCHAR(128) NOT NULL,
isChild BOOLEAN NOT NULL DEFAULT false
created_at TIMESTAMP NOT NULL DEFAULT NOW();
);
// CreateChild 用户变异
export const createChildAccount = mutationField('createChildAccount', {
type: 'User',
args: {
name: stringArg({ required: true }),
password: stringArg({ required: true }),
},
resolve: async (_parent, { name, password }, ctx) => {
const userId = getUserId(ctx);
if (!userId) {
// TODO -think I might need to throw an error here
return;
}
const user = await ctx.prisma.user.create({
data: {
name,
password,
ischild: true,
child: {
create: { child_id: ???????? },
},
parent: {
connect: {id: userId}
}
},
});
return user;
},
});
我真的应该创建一个 Relationship
然后用它来连接 parent 并创建 child 吗?
如果您只是存储子项和父项的 id
,我建议使用与相同 table hainv 的自我关系,例如在模式中
model User {
id Int @default(autoincrement()) @id
name String
parent User? @relation("UserToUser", fields: [parent_id], references: [id])
parent_id Int? @unique
createdAt DateTime @default(now())
}
对于SQL中的相同,则如下
create table "User" (
createdAt timestamp default now(),
"id" serial primary key,
"name" varchar not null,
parent_id int unique,
foreign key (parent_id) references "User"("id") on delete set null on update cascade
)
那么您的 create/update
调用将非常简单,方法如下
const parent = await prisma.user.create({
data: {
name: 'abc',
},
})
await prisma.user.create({
data: {
name: 'def',
parent: {
connect: {
id: parent.id,
},
},
},
})
事后看来,这是一个简单的解决方案。我在 User
中创建了一个条目,然后在 Relationship
table 中创建了一个条目,我在其中连接了父帐户和子帐户
export const createChildAccount = mutationField('createChildAccount', {
type: 'User',
args: {
name: stringArg({ required: true }),
password: stringArg({ required: true }),
},
resolve: async (_parent, { name, password }, ctx) => {
const userId = getUserId(ctx);
if (!userId) {
return;
}
const user = await ctx.prisma.user.create({
data: {
name,
password,
ischild: true,
},
});
await ctx.prisma.relationship.create({
data: {
parent: {
connect: {
id: userId,
},
},
child: {
connect: {
id: user.id,
},
},
},
});
return user;
},
});
我正在尝试创建一个用户,该用户是另一个用户的 child。我通过拥有一个用户 table 来管理这种关系,其中存储了所有用户 parents 和 children。有一个单独的 table,它只有 child 的 ID 和 parent 的 ID。
我的问题是,当我创建一个 child 帐户时,我想使用将要创建的用户 ID 在 Relationship
table 中创建一个条目。我完全不确定我应该怎么做。
// schema.sql
CREATE TABLE "public"."Relationship" (
id SERIAL PRIMARY KEY NOT NULL,
parent_id INT NOT NULL,
FOREIGN KEY (parent_id) REFERENCES "User" (id),
child_id INT NOT NULL,
FOREIGN KEY (child_id) REFERENCES "User" (id)
)
CREATE TABLE "public"."User" (
id SERIAL PRIMARY KEY NOT NULL,
name VARCHAR(128) NOT NULL,
email VARCHAR(128) UNIQUE,
password VARCHAR(128) NOT NULL,
isChild BOOLEAN NOT NULL DEFAULT false
created_at TIMESTAMP NOT NULL DEFAULT NOW();
);
// CreateChild 用户变异
export const createChildAccount = mutationField('createChildAccount', {
type: 'User',
args: {
name: stringArg({ required: true }),
password: stringArg({ required: true }),
},
resolve: async (_parent, { name, password }, ctx) => {
const userId = getUserId(ctx);
if (!userId) {
// TODO -think I might need to throw an error here
return;
}
const user = await ctx.prisma.user.create({
data: {
name,
password,
ischild: true,
child: {
create: { child_id: ???????? },
},
parent: {
connect: {id: userId}
}
},
});
return user;
},
});
我真的应该创建一个 Relationship
然后用它来连接 parent 并创建 child 吗?
如果您只是存储子项和父项的 id
,我建议使用与相同 table hainv 的自我关系,例如在模式中
model User {
id Int @default(autoincrement()) @id
name String
parent User? @relation("UserToUser", fields: [parent_id], references: [id])
parent_id Int? @unique
createdAt DateTime @default(now())
}
对于SQL中的相同,则如下
create table "User" (
createdAt timestamp default now(),
"id" serial primary key,
"name" varchar not null,
parent_id int unique,
foreign key (parent_id) references "User"("id") on delete set null on update cascade
)
那么您的 create/update
调用将非常简单,方法如下
const parent = await prisma.user.create({
data: {
name: 'abc',
},
})
await prisma.user.create({
data: {
name: 'def',
parent: {
connect: {
id: parent.id,
},
},
},
})
事后看来,这是一个简单的解决方案。我在 User
中创建了一个条目,然后在 Relationship
table 中创建了一个条目,我在其中连接了父帐户和子帐户
export const createChildAccount = mutationField('createChildAccount', {
type: 'User',
args: {
name: stringArg({ required: true }),
password: stringArg({ required: true }),
},
resolve: async (_parent, { name, password }, ctx) => {
const userId = getUserId(ctx);
if (!userId) {
return;
}
const user = await ctx.prisma.user.create({
data: {
name,
password,
ischild: true,
},
});
await ctx.prisma.relationship.create({
data: {
parent: {
connect: {
id: userId,
},
},
child: {
connect: {
id: user.id,
},
},
},
});
return user;
},
});