私は現在、ショッピング カートを実装するためのカスタム結合テーブルを使用する、ユーザーと製品の間の 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つのアイテムを削除したいだけですが、すべてのアイテムではありません。ありがとう!