`model`: 向您的模型添加自定义方法
Prisma Client 扩展从 4.16.0 及更高版本开始正式可用。它们在 4.7.0 版本中以预览形式推出。 如果您运行的版本低于 4.16.0,请确保启用 clientExtensions
预览功能标志。
您可以使用 model
Prisma Client 扩展 组件类型向您的模型添加自定义方法。
model
组件的可能用途包括以下几点
- 与现有 Prisma Client 操作(例如
findMany
)一起运行的新操作 - 封装的业务逻辑
- 重复性操作
- 模型特定的实用程序
添加自定义方法
使用 $extends
客户端级别方法 来创建一个扩展客户端。 扩展客户端是标准 Prisma Client 的变体,它被一个或多个扩展包装。 使用 model
扩展组件将方法添加到您的 schema 中的模型。
将自定义方法添加到特定模型
要扩展您的 schema 中的特定模型,请使用以下结构。 此示例向 user
模型添加方法。
const prisma = new PrismaClient().$extends({
name?: '<name>', // (optional) names the extension for error logs
model?: {
user: { ... } // in this case, we extend the `user` model
},
});
示例
以下示例将名为 signUp
的方法添加到 user
模型。 此方法使用指定的电子邮件地址创建一个新用户
const prisma = new PrismaClient().$extends({
model: {
user: {
async signUp(email: string) {
await prisma.user.create({ data: { email } })
},
},
},
})
您将在您的应用程序中按如下方式调用 signUp
const user = await prisma.user.signUp('john@prisma.io')
将自定义方法添加到您的 schema 中的所有模型
要扩展您的 schema 中的所有模型,请使用以下结构
const prisma = new PrismaClient().$extends({
name?: '<name>', // `name` is an optional field that you can use to name the extension for error logs
model?: {
$allModels: { ... }
},
})
示例
以下示例将 exists
方法添加到所有模型。
const prisma = new PrismaClient().$extends({
model: {
$allModels: {
async exists<T>(
this: T,
where: Prisma.Args<T, 'findFirst'>['where']
): Promise<boolean> {
// Get the current model at runtime
const context = Prisma.getExtensionContext(this)
const result = await (context as any).findFirst({ where })
return result !== null
},
},
},
})
您将在您的应用程序中按如下方式调用 exists
// `exists` method available on all models
await prisma.user.exists({ name: 'Alice' })
await prisma.post.exists({
OR: [{ title: { contains: 'Prisma' } }, { content: { contains: 'Prisma' } }],
})
从另一个自定义方法调用一个自定义方法
如果两个方法都声明在同一模型上,则可以从另一个自定义方法调用一个自定义方法。 例如,您可以从 user
模型上的另一个自定义方法调用 user
模型上的自定义方法。 两个方法是否在同一扩展中或在不同的扩展中声明都没有关系。
为此,请使用 Prisma.getExtensionContext(this).methodName
。 请注意,您不能使用 prisma.user.methodName
。 这是因为 prisma
尚未扩展,因此不包含新方法。
例如
const prisma = new PrismaClient().$extends({
model: {
user: {
firstMethod() {
...
},
secondMethod() {
Prisma.getExtensionContext(this).firstMethod()
}
}
}
})
在运行时获取当前模型名称
此功能从 4.9.0 版本开始可用。
您可以使用 Prisma.getExtensionContext(this).$name
在运行时获取当前模型的名称。 您可以使用它将模型名称写入日志,将名称发送到另一个服务,或根据模型分支您的代码。
例如
// `context` refers to the current model
const context = Prisma.getExtensionContext(this)
// `context.name` returns the name of the current model
console.log(context.name)
// Usage
await(context as any).findFirst({ args })
有关在运行时检索当前模型名称的具体示例,请参阅 将自定义方法添加到您的 schema 中的所有模型。
高级类型安全:用于定义通用扩展的类型实用程序
您可以使用 类型实用程序 提高共享扩展中 model
组件的类型安全性。