mysql - 如何创建如何在 typeorm 中创建多对多关系,[NestJS]
问题描述
如何以多对多关系保存数据?(用户,书籍(MTM))这里是用户和书籍之间的多对多关系。我的服务不正确。另外,我的代码不起作用。数据存储在书表中。
我需要你的帮助,一切都提前谢谢你。
我的堆栈 => NestJs、TypeORM、MySQL
有我的实体。 在此处输入图像描述
用户实体
@Entity('User')
export class User {
@PrimaryGeneratedColumn()
id!: number;
@Column()
real_name!: string;
@Column()
nick_name!: string;
@Column()
@IsEmail()
email!: string;
@Column()
password!: string;
@Column()
phone_number!: string;
@Column()
image_url: string;
@BeforeInsert()
async hashPassword() {
this.password = await argon2.hash(this.password, {type: argon2.argon2id, hashLength: 40});
}
}
书本实体
@Entity('Book')
export class Book {
@PrimaryGeneratedColumn()
id!: number;
@Column()
title: string;
@Column()
image_url: string;
@Column()
contents: string;
@Column({ type: 'datetime'})
datetime: string;
@ManyToMany(() => User)
@JoinTable()
users: User[];
}
书本控制器.ts
@UseGuards(JwtAuthGuard)
@Post('bpc')
savebpc(@Req() req: any, @Query('title') bookTitle: string){
return this.BookService.addBpc(req, bookTitle);
}
book.service.ts
async addBpc(req: any, bookTitle: string): Promise<any>{
const userId = req.user.id;
const bookId = await getRepository('Book')
.createQueryBuilder('book')
.where({title:bookTitle})
.getRawOne()
if (!bookId){
throw new NotFoundException('Not_found_book');
}
const user = await getRepository('User')
.createQueryBuilder('user')
.where({id: userId})
.getRawOne()
//bookId.user.push(user);
//await this.bookRepository.save(bookId);
let userdata = new User();
userdata.id = user.user_id;
userdata.real_name = user.user_real_name;
userdata.nick_name = user.user_nick_name;
userdata.email = user.user_email;
userdata.password = user.user_password;
userdata.image_url = user.user_image_url;
console.log(userdata);
let bookBpc = new Book();
bookBpc.title = bookId.book_title;
bookBpc.image_url = bookId.book_image_url;
bookBpc.contents = bookId.book_contents;
bookBpc.datetime = bookId.book_datetime;
bookBpc.users = [user];
console.log(bookBpc);
await this.bookRepository.create([bookBpc]);
return 'suceess';
}
解决方案
您需要在用户和书籍中添加多对多关系,这是一个使用 express 和 typeorm 的示例,但它与 nestjs 相同
用户实体:
@Entity()
export class User {
@PrimaryGeneratedColumn()
id: number;
@Column({ type: 'varchar', nullable: false, unique: true })
username: string;
// we need to add a default password and get it form the .env file
@Column({ type: 'varchar', nullable: true, default: '' })
password: string;
@Column({ type: 'varchar', nullable: true })
firstname: string;
@Column({ type: 'varchar', nullable: true })
lastname: string;
@Column({ type: 'varchar', nullable: false })
email: string;
@Column({ type: 'boolean', nullable: true, default: false })
connected: boolean;
@CreateDateColumn({ name: 'created_at' })
createdAt: Date;
@UpdateDateColumn({ name: 'updated_at' })
updatedAt: Date;
// new properties
@Column({ name: 'login_attempts', type: 'int', default: 0, nullable: true })
loginAttempts: number;
@Column({ name: 'lock_until', type: 'bigint', default: 0, nullable: true })
lockUntil: number;
//Many-to-many relation with role
@ManyToMany((type) => Role, {
cascade: true,
})
@JoinTable({
name: "users_roles",
joinColumn: { name: "userId", referencedColumnName: "id" },
inverseJoinColumn: { name: "roleId" }
})
roles: Role[];
}
角色实体:
@Entity()
export class Role {
@PrimaryGeneratedColumn()
id: number;
@Column({ type: 'varchar', nullable: false, unique: true })
profile: string;
@Column({ type: 'varchar', nullable: false })
description: string;
//Many-to-many relation with user
@ManyToMany((type) => User, (user) => user.roles)
users: User[];
@CreateDateColumn({ name: 'created_at' })
createdAt: Date;
@UpdateDateColumn({ name: 'updated_at' })
updatedAt: Date;
}
这就是如何在 user_role 中保存数据:
let entity = await this.userRepository.create(data); //here you create new dataobject that contain user columns
let entity2 = { ...entity, roles: data.selectedRoles } // you have to add the association roles here
const user = await this.userRepository.save(entity2);
推荐阅读
- azure - 尝试使用 Azure/MSAL 通过 Azure 活动目录和 API 身份验证实现 SSO
- linux - 在非 GUI 环境中使用 QPainter
- c# - 如何在 linux 中为 .Net Core HttpListener 配置 ssl
- javascript - 如何验证表单数据,然后通过 AJAX 发送,然后在同一页面上显示提交的结果
- java - java maven导入问题:错误:com.google.gson包不存在
- c - 为什么 CS50 IDE 不让我做基本的数学运算?难道我做错了什么?
- android - 亲属秩序的孩子不工作
- php - 控制器中 Laravel 6 参数的奇怪行为
- ember.js - 没有 cli 的 emberjs(版本 3)
- extjs - ext.js 窗口不适应按钮大小