TypeORM第三方关联表配置:实现Post与Category关联查询
解决方案
根据Strapi生成的现有表结构,我们需要在TypeORM实体中正确配置关联关系,完全匹配数据库字段与表名,避免触发表结构修改(因synchronize: false)。以下是完整的实体代码配置:
1. PostEntity 配置
@Entity({ name: 'posts' }) export class PostEntity { @PrimaryGeneratedColumn() id!: number; // 配置多对多关联,绑定Strapi生成的中间表 @ManyToMany(() => CategoryEntity, category => category.posts) @JoinTable({ name: 'posts_category_links', // 指定中间表名称 joinColumns: [{ name: 'post_id', referencedColumnName: 'id' }], // 中间表关联posts的字段 inverseJoinColumns: [{ name: 'category_id', referencedColumnName: 'id' }], // 中间表关联categories的字段 }) categories!: CategoryEntity[]; }
2. CategoryEntity 配置
@Entity({ name: 'categories' }) export class CategoryEntity { @PrimaryGeneratedColumn() id!: number; // 反向关联PostEntity,对应多对多关系 @ManyToMany(() => PostEntity, post => post.categories) posts!: PostEntity[]; }
3. PostCategoryLinkEntity 配置
@Entity('posts_category_links') export class PostCategoryLinkEntity { @PrimaryGeneratedColumn() id!: number; @Column({ name: 'post_order' }) postOrder!: number; @Column({ name: 'category_id' }) // 匹配Strapi生成的字段名 categoryId!: number; @Column({ name: 'post_id' }) // 匹配Strapi生成的字段名 postId!: number; // 可选:配置与Post、Category的多对一关联,方便单独操作中间表数据 @ManyToOne(() => PostEntity, post => post.postCategoryLinks) @JoinColumn({ name: 'post_id' }) post!: PostEntity; @ManyToOne(() => CategoryEntity, category => category.postCategoryLinks) @JoinColumn({ name: 'category_id' }) category!: CategoryEntity; }
调整查询逻辑
由于配置的是多对多关联,查询时需要将relations参数改为['categories']:
const posts = await this.postsRepository.find({ relations: ['categories'] });
如果业务逻辑要求每个Post仅关联单个Category(即保持原代码中category!: CategoryEntity的结构),可通过以下方式处理:
- 方式1:查询后在代码层提取第一个关联分类
const postsWithSingleCategory = posts.map(post => ({ ...post, category: post.categories[0] || null })); - 方式2:使用QueryBuilder直接查询单个关联分类
const posts = await this.postsRepository .createQueryBuilder('post') .leftJoinAndSelect('post.categories', 'category') .where('category.id = (SELECT MIN(category_id) FROM posts_category_links WHERE post_id = post.id)') .getMany();
注意:所有配置必须严格匹配Strapi生成的表结构,包括字段名、表名,避免TypeORM尝试修改数据库结构导致Strapi异常。
内容的提问来源于stack exchange,提问作者Alex G.
相关产品推荐
相关产品推荐

