增删改查
About 1 min
我们创建一个文章的增删改查案例
1. 在数据库中增加新模型
我们增加文章和栏目的模型:
// schema.prisma
generator client {
provider = "prisma-client-js"
}
datasource db {
provider = "mysql"
url = env("DATABASE_URL")
}
model user {
id Int @id @default(autoincrement()) @db.UnsignedInt
name String @unique
password String
}
model article {
id Int @id @default(autoincrement()) @db.UnsignedInt
title String
content String @db.Text
category category @relation(fields: [categoryId], references: [id], onDelete: Cascade)
categoryId Int @db.UnsignedInt
}
model category {
id Int @id @default(autoincrement()) @db.UnsignedInt
title String
articles article[]
}
创建Prisma模型后,生成SQL迁移文件并在数据库运行它们:
npx prisma migrate dev
2. 创建文章模块
我们可以使用命令直接生成资源:
nest g res article
选择REST API,然后选择使用CRUD即可
3. 完善数据传输对象(DTO)
// create-article.dto.ts
import { IsNotEmpty } from 'class-validator';
export class CreateArticleDto {
@IsNotEmpty({ message: '标题不能为空' })
title: string;
@IsNotEmpty({ message: '内容不能为空' })
content: string;
@IsNotEmpty({ message: '请选择栏目' })
categoryId: number;
}
4. 完成增删改查的服务
// article.service.ts
import { Injectable } from '@nestjs/common';
import { CreateArticleDto } from './dto/create-article.dto';
import { UpdateArticleDto } from './dto/update-article.dto';
import { PrismaService } from 'src/prisma/prisma.service';
@Injectable()
export class ArticleService {
constructor(private prisma: PrismaService) {}
create(createArticleDto: CreateArticleDto) {
return this.prisma.article.create({
data: {
title: createArticleDto.title,
content: createArticleDto.content,
categoryId: +createArticleDto.categoryId,
},
});
}
async findAll(page = 1, pageSize = 10) {
const skip = (page - 1) * pageSize;
const articles = await this.prisma.article.findMany({
skip,
take: pageSize,
});
return {
data: articles,
page: page,
pageSize: pageSize,
total: this.prisma.article.count(),
};
}
findOne(id: number) {
return this.prisma.article.findFirst({
where: { id },
});
}
update(id: number, updateArticleDto: UpdateArticleDto) {
return this.prisma.article.update({
where: {
id,
},
data: {
title: updateArticleDto.title,
content: updateArticleDto.content,
categoryId: +updateArticleDto.categoryId,
},
});
}
remove(id: number) {
return this.prisma.article.delete({
where: {
id,
},
});
}
}