D13 的任务是在应用里添加一个评论功能,评论也是应用里的一种实体,围绕这种实体可以去创建一个评论模块。
src/modules/comment/comment.entity.ts
import { Entity, PrimaryGeneratedColumn, Column, CreateDateColumn, UpdateDateColumn, ManyToOne } from 'typeorm'; import { Post } from '../post/post.entity'; import { User } from '../user/user.entity'; @Entity() export class Comment { @PrimaryGeneratedColumn() id: number; @Column({ nullable: true }) title: string; @Column() body: string; @CreateDateColumn() created: Date; @UpdateDateColumn() updated: Date; @ManyToOne(type => Post, post => post.comments, { nullable: false }) post: Post; @ManyToOne(type => User, user => user.comments, { nullable: false }) user: User; }
我们尽量保持实体的定义简单,你可以根据自己的需求去添加其它需要的字段。注意在定义评论实体的时候定义了评论与文章,还有评论与用户之间的关系。一条评论只能属于一个内容,评论也只能有一个作者,所以用 @ManyToOne 来定义它们的关系。
处理评论发布请求用的方法:
src/modules/comment/comment.service.ts
async storePostComment(id: number, user: User, data: CommentDto) { return await this.commentRepository.save({ user, ...data, post: { id } }) }
存储评论的时候需要知道评论所属的内容的 id 号,还有评论的作者是谁。给 Repository 的 save 方法提供的数据里面,user 与 post 这两个属性是我们在评论实体上定义的用户与内容关系的名字。
处理显示文章内容评论用的方法:
async showPostComments(id: number) { return await this.commentRepository .createQueryBuilder('comment') .leftJoinAndSelect('comment.user', 'user') .leftJoinAndSelect('comment.post', 'post') .where('post.id = :id', { id }) .getMany(); }
处理显示用户评论列表的方法:
async showUserComments(id: number) { return await this.commentRepository .createQueryBuilder('comment') .leftJoinAndSelect('comment.user', 'user') .leftJoinAndSelect('comment.post', 'post') .where('user.id = :id', { id }) .getMany(); }