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;
}