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 を確認したところ、user_in_cart_products 結合テーブル内のすべてに対して user_id が NULL に設定されました。

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

では、どうすればこの問題を解決できますか? コレクションでその1つのアイテムを削除したいだけですが、すべてのアイテムではありません。ありがとう!

4

0 に答える 0