Tengo una relación ManyToMany de usuarios y proyectos de la siguiente manera:
// project.entity.ts @Entity() export class Project extends BaseEntity { @PrimaryGeneratedColumn() id: number; @Column() name: string; @OneToMany(type => ProjectUser, projectUser => projectUser.project) projectUsers: ProjectUser[]; @CreateDateColumn({ type: 'timestamp', default: () => 'CURRENT_TIMESTAMP', readonly: true }) createdAt: Date; @UpdateDateColumn({ type: 'timestamp', default: () => 'CURRENT_TIMESTAMP' }) updatedAt: Date; @DeleteDateColumn({ type: 'timestamp' }) deletedAt: Date; } // user.entity.ts @Entity() export class User extends BaseEntity { @PrimaryGeneratedColumn() id: number; @Column() email: string; @Column() password: string; @OneToMany(type => ProjectUser, projectUser => projectUser.user) projectUsers: ProjectUser; @CreateDateColumn({ type: 'timestamp', default: () => 'CURRENT_TIMESTAMP', readonly: true }) createdAt: Date; @UpdateDateColumn({ type: 'timestamp', default: () => 'CURRENT_TIMESTAMP' }) updatedAt: Date; @DeleteDateColumn({ type: 'timestamp' }) deletedAt: Date; } // project_user.entity.ts @Entity() export class ProjectUser extends BaseEntity{ @PrimaryGeneratedColumn() id: number; @Column() projectId: number; @Column() userId: number; @Column() isUserCreator: boolean; @ManyToOne(type => Project, project => project.projectUsers) @JoinColumn() project: Project; @ManyToOne(type => User, user => user.projectUsers) @JoinColumn() user: User; } Cuando trato de guardar un nuevo proyecto, el nuevo registro ProjectUser no se guarda.
// project.service.ts async create(project: DeepPartial<Project>): Promise<Project> { ---> project { name: 'project1', projectUsers: [{userId: 1, isUserCreator: true}] const projectToSave = Project.create(project) projectToSave.projectUsers = ProjectUser.create(project.projectUsers) return await projectToSave.save(); }¿Alguna idea de por qué no puedo guardar el registro en la tabla relacionada?
Solo creó instancias projectUsers pero no las guardó.
Use el siguiente código para guardar todo el project y projectUsers :
const projectToSave = Project.create(project); await projectToSave.save(); const projectUsers = ProjectUser.create(project.projectUsers); projectUsers.forEach(p => p.project = projectToSave); await projectUsers.save(projectUsers); return projectToSave;O
const projectUsers = await ProjectUser.save(ProjectUser.create(project.projectUsers)); const projectToSave = Project.create(project); projectToSave.projectUsers = projectUsers; return await projectToSave.save(); Otra solución Puede configurar la opción de cascade en su entidad para guardar automáticamente.