# douxian-back **Repository Path**: lventou/douxian-back ## Basic Information - **Project Name**: douxian-back - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-07-17 - **Last Updated**: 2026-01-17 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README 1. 后面新项目用接口也用驼峰,entity 就用下划线@Entity('subscribe') 2. baseService的 findPage 吧分页整合进 where 3. 数据库字段全都用下划线 一个非常重要的判断标准(以后通用) 如果把其中一个 Entity 拿走, 这个业务还能完整运转吗? ❌ 不能 → 同一个 module ✅ 能 → 才考虑拆 module 你的 wheel: 👉 拿走任何一个都不行 → 必须合 at TCP.onStreamRead (node:internal/stream_base_commons:189:23) [Nest] 10643 - 2025/11/21 00:25:21 ERROR [ExceptionHandler] Cannot add or update a child row: a foreign key constraint fails (`douxian`.`#sql-330ac_4736`, CONSTRAINT `FK_9e0bd747b6fa2ce75e537947e53` FOREIGN KEY (`userUid`) REFERENCES `player_user` (`uid`) ON DELETE CASCADE) 执行 SELECT TABLE_NAME, COLUMN_NAME, CONSTRAINT_NAME FROM information_schema.KEY_COLUMN_USAGE WHERE REFERENCED_TABLE_NAME = 'player_user' AND TABLE_SCHEMA = 'douxian'; ALTER TABLE `user_wheel_task` DROP FOREIGN KEY `FK_9e0bd747b6fa2ce75e537947e53`; 🎯 什么是「反向关系」 所谓 反向关系(inverse side) 就是: 👉 在关系的 另一端,有没有一个字段可以反向找到你。 举个例子: 你有 ManyToOne(多对一) @ManyToOne(() => PlayerUser, user => user.invitedUsers) invitedBy: PlayerUser 表示: 我(当前用户)被某个 PlayerUser 邀请。 🔥 如果 PlayerUser 里写了 OneToMany @OneToMany(() => PlayerUser, player => player.invitedBy) invitedUsers: PlayerUser[] 这就是 反向关系。 它表示: 一个玩家(A)可以邀请多个玩家(B,C,D...) 这样你就可以: (1)从 B 找到 A: b.invitedBy (2)从 A 找到所有 B,C,D: a.invitedUsers 这就是反向关系带来的能力。 🚫 如果你不写反向关系(即省略 OneToMany) 例如: @ManyToOne(() => PlayerUser) invitedBy: PlayerUser 那意味着: 你仍然能从 B 找到 A(b.invitedBy) ❌ 但你不能从 A 找到所有 B(因为没有 invitedUsers 这种字段) 即: 你只有「正向关系」,但没有「反向关系」。 ✨ 反向关系的意义总结 能力 写了反向关系 不写反向关系 是否能从 B 找到 A(ManyToOne 自己) ✔ 能 ✔ 能 是否能从 A 找到所有 B(OneToMany) ✔ 能 ❌ 不能 是否能在 query builder 中 join 两端 ✔ 完美支持 ❌ 反向 join 不方便 Swagger / DTO / 序列化 可控制、可隐藏 没有字段可用 关系是否更清晰 ✔ 清晰 😅 单向,不完整 数据库外键是否正常 ✔ 正常 ✔ 正常 注意: 是否写反向关系,对数据库表结构没有影响 反向关系只是 TypeORM 层面的「对象模型」辅助,不改变数据库结构。 🧠 最重要的一句话总结 ManyToOne 是外键,OneToMany 只是为了让你能从另一边找到回去,不写也可以。 你写了 ManyToOne → 外键就存在 你写不写 OneToMany → 完全看你需不需要“从父查子” 📌 回到你的实体 你有这个关系: @ManyToOne(() => PlayerUser, player => player.invitedUsers) invitedBy?: PlayerUser = 我被某人邀请 如果你删掉反向关系(OneToMany) @ManyToOne(() => PlayerUser) invitedBy?: PlayerUser 那么你 仍然可以: child.invitedBy // OK 但你 不能: parent.invitedUsers // 没这个字段 也没法: leftJoinAndSelect("user.invitedUsers", ...) 🎯 什么时候需要 OneToMany(反向关系)? 符合下面任意一点,就应该写: 你想看到“我邀请了哪些人” 后台有列表查询,被邀请的人是谁 你想从父级查子级数据 你要在 service 里写:relations: ['invitedUsers'] 你要在 query builder 中 join 反方向 💤 什么时候可以不写? 如果你只是: 只需要 knowing 谁邀请了我 不关心“一共邀请了多少人”这种查询 那么可以完全不写反向: @ManyToOne(() => PlayerUser) invitedBy: PlayerUser