Skip to content

Nest 自己开发的分页查询插件

新建一个 prisma.extension2.service.ts

ts
import { Injectable } from "@nestjs/common";
import { Prisma } from "@prisma/client/extension.js";

@Injectable()
export class PrismaQueryHelperService2 {
  existsExtension = Prisma.defineExtension({
    name: "extension2",
    model: {
      $allModels: {
        async paginate<T>(
          this: T,
          page: number,
          pageSize: number,
          options: any = {}
        ): Promise<any> {
          const context = Prisma.getExtensionContext(this);
          const skip = (page - 1) * pageSize;
          const [data, total] = await Promise.all([
            (context as any).findMany({
              skip,
              take: pageSize,
              ...options,
            }),
            (context as any).count({ where: options.where }),
          ]);
          return {
            data,
            pagination: {
              total,
              page,
              pageSize,
              totalPages: Math.ceil(total / pageSize),
              hasNextPage: page < Math.ceil(total / pageSize),
              hasPreviousPage: page > 1,
            },
          };
        },
      },
    },
  });
}

prisma.provider.ts

ts
import { Injectable, OnModuleDestroy, OnModuleInit } from "@nestjs/common";
import { PrismaClient } from "../../../prisma/generated/prisma/client"; // 修改为你自己的
import { PrismaQueryHelperService } from "./prisma.extension.service"; // 扩展
import { PrismaQueryHelperService2 } from "./prisma.extension2.service"; // 扩展2
// 读写分离 这样读是一个数据库 写又是另外一个数据库
import { readReplicas } from "@prisma/extension-read-replicas";
import { ConfigService } from "@nestjs/config";
@Injectable()
export class PrismaProvider
  extends PrismaClient
  implements OnModuleInit, OnModuleDestroy
{
  private static initialized = false;

  constructor(
    private readonly configService: ConfigService,
    private readonly PrismaQueryHelperService: PrismaQueryHelperService,
    private readonly PrismaQueryHelperService2: PrismaQueryHelperService2
  ) {
    super({
      datasourceUrl: configService.get("DATABASE_URL"),
      log: ["info", "query"],
    });
  }

  async onModuleInit() {
    if (!PrismaProvider.initialized) {
      PrismaProvider.initialized = true;
      await this.$connect();
    }
  }

  async onModuleDestroy() {
    if (PrismaProvider.initialized) {
      PrismaProvider.initialized = false;
      await this.$disconnect();
    }
  }
  // 增加扩展 // 读写分离 绑定两个扩展
  withExtensions() {
    // 读的客户端
    const readReplicasClient = new PrismaClient({
      datasourceUrl: this.configService.get("DATABASE_READ_URL"),
      log: ["info", "query"],
    });
    return this.$extends(this.PrismaQueryHelperService.existsExtension)
      .$extends(
        readReplicas({
          replicas: [readReplicasClient],
        })
      )
      .$extends(this.PrismaQueryHelperService2.existsExtension);
  }
}

prisma.module.ts

  • 模型里面写
ts
import { PrismadbService } from "./prisma.service"; // 服务

import { Module, Global } from "@nestjs/common";

import { PrismaProvider } from "./prisma.provider"; // 提供

import { PrismaQueryHelperService } from "./prisma.extension.service"; // 扩展

import { PrismaQueryHelperService2 } from "./prisma.extension2.service"; // 扩展
@Global() // Global decorator to make this module available globally
@Module({
  imports: [],
  controllers: [],
  providers: [
    PrismadbService,
    PrismaProvider,
    PrismaQueryHelperService,
    PrismaQueryHelperService2,
  ],
  exports: [
    PrismadbService,
    PrismaProvider,
    PrismaQueryHelperService,
    PrismaQueryHelperService2,
  ],
})
export class PrismadbModule {}

使用

ts
  // 测试分页
  async testextension() {
    let page = 1; // 当前页
    let pagesize = 2; // 每页条数
    const result = await this.prisma.users.paginate(page, pagesize, {
      where: { id: { gte: 2 } },
      orderBy: { id: 'desc' },
      select: {
        username: true,
        user_roles: true,
      },
    });
    return result;
  }