Эффективный способ массовой вставки / обновления с использованием typeORM - PullRequest
0 голосов
/ 20 октября 2019

Как можно вставить предварительно созданные объекты в связь с объектом, используя TypeORM? Как я знаю, неэффективным является это (многие ко многим отношениям):

 const tags = await Tag.findByIds(tagIds);
 const todo = await Todo.findOne(todoId);
 todo.tags = tags;
 return await Todo.save(todo)

Также .add() свойство RelationalQueryBuilder принимает один объект или идентификатор, как упомянуто в документах

await getConnection()
    .createQueryBuilder()
    .relation(Post, "categories")
    .of(1)
    .add(3);

Так каков эффективный способ массовой вставки?

1 Ответ

0 голосов
/ 21 октября 2019

У меня была ошибка при использовании @Arg, импортированного из typeGraphql для передачи массива строк, поэтому я решил его так, чтобы add() из typeOrm взял массив Id, поэтому быстрый и производительный пример реляционного запроса:

import { Resolver, Arg, Mutation } from "type-graphql";
import { Todo } from "../../entity/Todo";
import { createQueryBuilder } from "typeorm";

@Resolver()
export class BulkAssignTagsResolver {
  @Mutation(() => Todo)
  async bulkAssignTodoTag(
    @Arg("tagIds", () => [String]) tagIds: string[],
    @Arg("todoId") todoId: string
  ): Promise<Todo | undefined> {
    await createQueryBuilder("todo")
      .relation(Todo, "tags")
      .of(todoId)
      .add(tagIds);

    return Todo.findOne(todoId, { relations: ["tags"] });
  }
}

...