Docs: Add examples for update many-to-many relations with custom properties
See original GitHub issueIssue type: [x] documentation issue
Database system/driver:
[x] mysql
/ mariadb
TypeORM version:
[x] latest
Steps to reproduce or a small repository showing the problem: Is it possible to add more examples in docs for “many-to-many relations with custom properties”? I’m having trouble getting it to work. For example save/update a many to many entity from one of the relationship:
I have 3 tables: users, roles, user_roles
User.ts
@Entity('users')
class User {
@PrimaryGeneratedColumn('increment')
id: number;
@Column()
name: string;
@Column()
email: string;
@OneToMany(() => UserRole, userRole => userRole.user, {
cascade: true,
onDelete: 'CASCADE',
onUpdate: 'CASCADE',
})
@JoinColumn({ referencedColumnName: 'user_id' })
userRoles!: UserRole[];
}
export default User;
Role.ts
@Entity('roles')
class Role {
@PrimaryGeneratedColumn('increment')
id: number;
@Column()
role: string;
@OneToMany(() => UserRole, userRole => userRole.role, {
cascade: true,
onDelete: 'CASCADE',
onUpdate: 'CASCADE',
})
@JoinColumn({ referencedColumnName: 'role_id' })
userRoles!: UserRole[];
}
export default Role;
UserRole.ts
@Entity('user_roles')
class UserRole {
@PrimaryGeneratedColumn('increment')
id: number;
@Column()
user_id!: number;
@Column()
role_id!: number;
@CreateDateColumn()
created_at: Date;
@UpdateDateColumn()
updated_at: Date;
@ManyToOne(() => User, user => user.userRoles)
@JoinColumn({ name: 'user_id' })
user!: User;
@ManyToOne(() => Role, role => role.userRoles)
@JoinColumn({ name: 'role_id' })
role!: Role;
}
export default UserRole;
Create a record in user_roles is working, I can save a user with related userRoles:
const user = {
name: 'test',
email: 'test@test.com',
userRoles: [
{ role_id: 1 },
{ role_id: 2 },
{ role_id: 3 },
{ role_id: 4 }
],
};
await this.usersRepository.save(user);
Update its not working, I want to replace all related user_roles with the new ones, is there any save strategy option in typeorm many to many relation? I have seen in other orms for example ‘replace’ or ‘append‘ option in relation definition This is how im trying to update:
// load user
const user = await this.usersRepository.findById(user_id);
/*
returns
User {
id: 2,
name: 'Test user',
email: 'testuser@test.com',
userRoles: [
UserRole {
id: 376,
user_id: 2,
role_id: 1,
created_at: 2020-09-18T17:26:52.000Z,
updated_at: 2020-09-18T17:26:52.000Z
},
UserRole {
id: 377,
user_id: 2,
role_id: 2,
created_at: 2020-09-18T17:26:52.000Z,
updated_at: 2020-09-18T17:26:52.000Z
},
UserRole {
id: 378,
user_id: 2,
role_id: 3,
created_at: 2020-09-18T17:26:53.000Z,
updated_at: 2020-09-18T17:26:53.000Z
},
UserRole {
id: 379,
user_id: 2,
role_id: 4,
created_at: 2020-09-18T17:26:53.000Z,
updated_at: 2020-09-18T17:26:53.000Z
}
]
}
*/
// edit user
const newRolesIds = [4, 5, 6,];
user.name = 'updated name';
user.email = 'updatedemail@test.com';
// isnt it suposed to replace old user_roles and create this new ones?
user.userRoles = newRolesIds.map(role_id => {
const userRole = new UserRole();
userRole.user_id = user_id;
userRole.role_id = role_id;
return userRole;
});
/*
user after edit:
User {
id: 2,
name: 'updated name',
email: 'updatedemail@test.com',
userRoles: [
UserRole { user_id: 2, role_id: 4 },
UserRole { user_id: 2, role_id: 5 },
UserRole { user_id: 2, role_id: 6 },
]
}
*/
this.ormRepository.save(user);
Save fails with this sql error Its a strange update sql, not recognizing user_id and role_id is not eve present in sql am I forgetting to define something in relationships?
QueryFailedError: Cannot add or update a child row: a foreign key constraint fails (`user_roles`, CONSTRAINT `UserRoleUserIdFK` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE ON UPDATE CASCADE)
code: 'ER_NO_REFERENCED_ROW_2',
errno: 1452,
sqlState: '23000',
sqlMessage: 'Cannot add or update a child row: a foreign key constraint fails (`user_roles`, CONSTRAINT `UserRoleUserIdFK` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE ON UPDATE CASCADE)',
query: 'UPDATE `user_roles` SET `user_id` = ?, `updated_at` = CURRENT_TIMESTAMP WHERE `id` = ?',
parameters: [ undefined, 376 ]
Issue Analytics
- State:
- Created 3 years ago
- Comments:6 (4 by maintainers)
Top GitHub Comments
@sa-webb typeorm dont suport delete orphaned rows it set the related key to null and in my case it cant be null because its a FK with index, just delete works. There are a PR to add this feat, its exactly my relationship:
https://github.com/typeorm/typeorm/pull/7105
@allandiego I had a lot of issues working with my relationships in my database but ended up working them out. I can try to help you resolve this if I can. I am quite confused by your data modeling though. Without explaining why you’ve defined those three entities can you tell me your desired functionality?