跳至主要内容

计算字段

计算字段允许您根据现有数据推导出一个新字段。一个常见的示例是当您想要计算全名时。在您的数据库中,您可能只存储了名字和姓氏,但您可以定义一个函数,通过组合名字和姓氏来计算全名。计算字段是只读的,存储在应用程序的内存中,而不是存储在您的数据库中。

使用 Prisma Client 扩展

以下示例说明了如何创建 Prisma Client 扩展,该扩展在运行时向 Prisma schema 中的 User 模型添加一个 fullName 计算字段。

import { PrismaClient } from '@prisma/client'

const prisma = new PrismaClient().$extends({
result: {
user: {
fullName: {
needs: { firstName: true, lastName: true },
compute(user) {
return `${user.firstName} ${user.lastName}`
},
},
},
},
})

async function main() {
/**
* Example query containing the `fullName` computed field in the response
*/
const user = await prisma.user.findFirst()
}

main()
显示CLI结果

计算字段是类型安全的,可以返回从连接值到复杂对象或可以充当模型实例方法的函数的任何内容。

Prisma ORM 4.16.0 之前的说明
警告

从 Prisma ORM 版本 4.16.0 开始,Prisma Client 扩展普遍可用,因此不建议使用以下步骤。请使用 客户端扩展 来完成此操作。

Prisma Client 尚未原生支持计算字段,但您可以定义一个接受泛型类型作为输入的函数,然后扩展该泛型以确保它符合特定结构。最后,您可以返回该泛型,并添加额外的计算字段。让我们看看它可能是什么样子

// Define a type that needs a first and last name
type FirstLastName = {
firstName: string
lastName: string
}

// Extend the T generic with the fullName attribute
type WithFullName<T> = T & {
fullName: string
}

// Take objects that satisfy FirstLastName and computes a full name
function computeFullName<User extends FirstLastName>(
user: User
): WithFullName<User> {
return {
...user,
fullName: user.firstName + ' ' + user.lastName,
}
}

async function main() {
const user = await prisma.user.findUnique({ where: 1 })
const userWithFullName = computeFullName(user)
}

在上面的 TypeScript 示例中,已定义了一个 User 泛型,它扩展了 FirstLastName 类型。这意味着您传递给 computeFullName 的任何内容都必须包含 firstNamelastName 键。

还定义了一个 WithFullName<User> 返回类型,它获取任何 User,并添加一个 fullName 字符串属性。

使用此函数,任何包含 firstNamelastName 键的对象都可以计算 fullName。非常棒,对吧?

更进一步

  • 了解如何使用 Prisma Client 扩展 向您的 schema 添加计算字段 - 示例.
  • 了解如何将 computeFullName 函数移入 自定义模型 中。
  • 有一个 开放的功能请求 为 Prisma Client 添加原生支持。如果您希望看到它实现,请务必为该问题点赞并分享您的用例!