首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Prisma2:在create函数中使用相关表中的用户id

Prisma2:在create函数中使用相关表中的用户id
EN

Stack Overflow用户
提问于 2020-04-26 05:07:26
回答 2查看 3.6K关注 0票数 0

我正在尝试创建一个用户,该用户是另一个用户的子用户。我通过拥有一个用户表来管理这种关系,其中存储了所有用户、父母和孩子。有一个单独的表,它只具有子表的id和父表的id。

我的问题是,当我创建子帐户时,我希望使用要创建的用户id在Relationship表中创建一个条目。我一点也不确定该怎么做。

// schema.sql

代码语言:javascript
复制
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用户突变

代码语言:javascript
复制
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,然后使用它连接父节点并创建子节点吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-05-01 08:54:40

事后看来,这是一个简单的解决办法。我在User中创建了条目,然后在Relationship表中创建了一个条目,其中连接了父帐户和子帐户。

代码语言:javascript
复制
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;
  },
});
票数 0
EN

Stack Overflow用户

发布于 2020-04-27 15:39:39

如果您只是存储子表和父表的id,我建议在模式中使用与相同表hainv的自相关关系。

代码语言:javascript
复制
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中的相同情况,如下所示

代码语言:javascript
复制
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调用将以以下方式非常简单

代码语言:javascript
复制
const parent = await prisma.user.create({
  data: {
    name: 'abc',
  },
})

await prisma.user.create({
  data: {
    name: 'def',
    parent: {
      connect: {
        id: parent.id,
      },
    },
  },
})
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61436069

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档