Удалите идентификатор из массива идентификаторов с помощью Typeorm & PSQL - PullRequest
0 голосов
/ 09 мая 2020

У меня есть книга лайков, содержащая массив идентификаторов пользователей. Пользователь может любить и отличать книгу. Если им понравится книга, их userId будет помещен в book.likes. Если они не похожи на книгу, их userId будет удален из book.likes

До сих пор я мог разрешить пользователю лайкать книгу (хотя я чувствовал, что должен быть лучший способ ). Однако я не могу реализовать непохожую функцию. Я стараюсь избегать использования метода фильтрации, потому что, если массив станет слишком большим, метод фильтрации не будет эффективным (если нет другого способа, мне придется вернуться к методу фильтра)

Мне нравится использовать конструктор запросов Typeorm для выполнения функции "вытаскивания" идентификатора пользователя из массива book.likes, если пользователь не похож на книгу. Кто-нибудь знает, как это сделать? Спасибо

  @Mutation(() => Boolean)
  @UseMiddleware(isAuth)
  async likeBook(
    @Arg("bookId") bookId: string,
    @Ctx() { payload }: ContextType
  ): Promise<boolean> {
    const book = await Book.findOne({ where: { id: bookId } });

    if (!book) {
      return false;
    }

    const like = await getManager()
      .createQueryBuilder(Book, "book")
      .where("book.id = :bookId", { bookId: bookId })
      .andWhere("book.likes @> ARRAY[:userId]", { userId: payload?.userId })
      .getOne();

    console.log("list ", like);

    if (!like) {
      book.likes.push(payload?.userId!);
      book.save();
    }

// Implement unlike feature



    return true;
  }

...