首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Typegraphql+TypeORM:保存/更新实体数组

Typegraphql+TypeORM:保存/更新实体数组
EN

Stack Overflow用户
提问于 2020-10-05 17:02:07
回答 2查看 2.5K关注 0票数 3

我有一个graphql服务器和一个role表,我想在一个变体中保存多个角色。

我找了很多,但什么也没找到。

我如何做一些事情,比如:

代码语言:javascript
复制
mutation {
  addRoles (roles: [
    {
      name: "role1",
      description: "role 1"
    },
    {
      name: "role2",
      description: "role 2"
    },
    ...
  ])
}

换句话说,如何实现addRolesupdateRoles解析器?

for循环是唯一的选择吗?是否可以在一次DB调用中保存所有角色?

role模型:

代码语言:javascript
复制
@Entity("role")
@ObjectType()
export class Role extends BaseEntity {
  @Field((type) => Number)
  @PrimaryGeneratedColumn()
  readonly id!: number;

  @Field()
  @Column({ length: 64 })
  name!: string;

  @Field({ nullable: true })
  @Column({ length: 512, nullable: true })
  description!: string;
}

以及添加和更新解析器:

代码语言:javascript
复制
@Resolver((of) => Role)
export class RoleResolver {

  @Mutation((returns) => Boolean)
  async addRole(
    @Arg("role") role: AddRoleInput
  ): Promise<Boolean> {
    const roleExists = await Role.count({ name: role.name });
    if (roleExists > 0)
      throw new Error(`Role with name "${role.name}" already exists!`);

    const newRole = Role.create(role);
    await newRole.save();
    return true;
  }

  @Mutation((returns) => Boolean)
  async updateRole(
    @Arg("role") role: UpdateRoleInput
  ): Promise<Boolean> {
    const oldRole = await Role.findOneOrFail(role.id);
    Object.assign(oldRole, role);
    await oldRole.save();
    return true;
  }
}

以及AddRoleInputUpdateRoleInput

代码语言:javascript
复制
@InputType({ description: "New Role Argument" })
export class AddRoleInput implements Partial<Role> {
  @Field()
  name!: string;

  @Field({ nullable: true })
  description?: string;
}

@InputType({ description: "Update Role Argument" })
export class UpdateRoleInput implements Partial<Role> {
  @Field()
  id!: number;

  @Field()
  name!: string;

  @Field({ nullable: true })
  description?: string;
}
EN

回答 2

Stack Overflow用户

发布于 2020-10-09 10:01:31

我设法通过试错找到了答案。我会把它贴在这里,以防有人有同样的问题:

代码语言:javascript
复制
@Resolver((of) => Role)
export class RoleResolver {

  @Mutation((returns) => Boolean)
  async addRoles(
    @Arg("roles", type => [AddRoleInput]) roles: AddRoleInput[]
  ): Promise<Boolean> {

    // also checks at front
    const roleExists = await Role.count({
      name: In(roles.map((role) => role.name)),
    });
    if (roleExists > 0)
      throw new Error(`Role name conflict!`);
 
    const newRoles = []
    for (let i=0, i < roles.length, i++) {
        const newRole = Role.create(roles[i]);
        newRoles.push(newRole);
    }

    // this is the solution
    // turns out an entity class can be used to save instances
    // failed to found this in the docs though
    await Role.save(newRoles);

    return true;
  }
...
}

我会保持悬赏以防有更好的答案。

票数 2
EN

Stack Overflow用户

发布于 2020-10-07 12:08:27

您需要做的要点是在您的模式中的突变类型上定义一个addRoles字段。例如

代码语言:javascript
复制
export const RoleSchema = gql`
  type Role {
    id: Int
    # Other fields omitted for brevity
  }

  extend type Mutation {
    # This should already exist
    addRole(role: AddRoleInput!): Role!

    # To accept multiple Input Types, use the List construct
    addRoles(roles: [AddRoleInput!]!): [Role!]
  }
`;

然后在解析器中定义addRoles并调用相应的接口。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64205541

复制
相关文章

相似问题

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