`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` 元件的型別安全。