跳到主要内容

`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` 组件的类型安全。

© . All rights reserved.