0

我目前正在实现用户和产品之间的 M:M 关系,该产品使用自定义连接表来实现购物车。这是自定义连接表:

@Entity({ tableName: "users_in_cart_products" })
export class UserInCartProducts {
  @ManyToOne(() => User, { primary: true, nullable: true })
  user: User;

  @ManyToOne(() => Product, { primary: true, nullable: true })
  product: Product;

  @Property()
  amount: number;
}

用户实体的部分(类似于产品)

@Entity({ tableName: "users", customRepository: () => UserRepository })
export class User {
  @PrimaryKey()
  id: string = v4();

  /* some properties */

  @OneToMany(() => UserInCartProducts, (userInCartProducts) => userInCartProducts.user)
  userInCartProducts = new Collection<UserInCartProducts>(this);
}

我目前正在实现一项功能,将产品从购物车中删除。但是,当我调用 user.userInCartProducts.remove() 时,它不仅会删除该元素,还会从 user.userInCartProducts 中删除所有内容,留下一个空数组。以下是从用户购物车中删除产品的代码:

  async removeCartItem(userId: string, productId: string) {
    const user = await this.userRepository.findOneOrFail({ id: userId }, [
      "userInCartProducts",
      "userInCartProducts.product",
    ]);

    for (const e of user.userInCartProducts) {
      if (e.product.id === productId) user.userInCartProducts.remove(e);
    }

    await this.userRepository.persistAndFlush(user);

    return user;
  }

我检查了从 Mikro-orm 生成的 SQL,并以某种方式将 users_in_cart_products 连接表中的所有内容的 user_id 设置为 NULL:

[query] update "users_in_cart_products" set "user_id" = NULL [took 2808 ms]

那么我该如何解决这个问题呢?我只想让集合删除那个项目,而不是每一个项目。谢谢!

4

0 回答 0