增删改查

Mr.ZhaoAbout 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,
      },
    });
  }
}