跳到主要內容

`model`:為您的模型新增自訂方法

資訊

Prisma Client 擴充功能從 4.16.0 及更高版本起正式發布。它們在 4.7.0 版本中以預覽形式推出。如果您執行的版本早於 4.16.0,請確保啟用 clientExtensions 預覽功能旗標。

您可以使用 model Prisma Client 擴充功能 組件類型,為您的模型新增自訂方法。

model 組件可能的用途包括以下幾項:

  • 與現有的 Prisma Client 操作(例如 findMany)並行運作的新操作
  • 封裝的業務邏輯
  • 重複操作
  • 模型專用工具

新增自訂方法

使用 $extends 客戶端層級方法 建立擴充的客戶端。擴充的客戶端是標準 Prisma Client 的變體,它被一個或多個擴充功能包裝。使用 model 擴充組件,將方法新增至您結構描述中的模型。

為特定模型新增自訂方法

若要擴充您結構描述中的特定模型,請使用以下結構。此範例將方法新增至 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')

為您結構描述中的所有模型新增自訂方法

若要擴充所有結構描述中的模型,請使用以下結構

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

請參閱為您結構描述中的所有模型新增自訂方法以取得在執行階段擷取目前模型名稱的具體範例。

進階類型安全:用於定義泛型擴充功能的類型工具

您可以使用類型工具來提高共用擴充功能中 model 組件的類型安全性。