`model`: モデルにカスタムメソッドを追加する
Prisma Client拡張機能は、バージョン4.16.0以降で一般利用可能です。バージョン4.7.0でプレビューとして導入されました。バージョン4.16.0より前のバージョンを使用している場合は、`clientExtensions`プレビュー機能フラグを有効にしてください。
`model` Prisma Client拡張機能コンポーネントタイプを使用して、モデルにカスタムメソッドを追加できます。
`model`コンポーネントの利用例は以下の通りです。
- `findMany`などの既存のPrisma Client操作と並行して動作する新しい操作
- カプセル化されたビジネスロジック
- 繰り返しの操作
- モデル固有のユーティリティ
カスタムメソッドを追加する
`$extends` クライアントレベルメソッドを使用して、拡張クライアントを作成します。拡張クライアントは、1つ以上の拡張機能によってラップされた標準の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
},
});
例
以下の例では、`user`モデルに`signUp`というメソッドを追加します。このメソッドは、指定されたメールアドレスを持つ新しいユーザーを作成します。
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' } }],
})
別のカスタムメソッドからカスタムメソッドを呼び出す
2つのメソッドが同じモデルで宣言されている場合、あるカスタムメソッドから別のカスタムメソッドを呼び出すことができます。たとえば、`user`モデル上の別のカスタムメソッドから`user`モデル上のカスタムメソッドを呼び出すことができます。2つのメソッドが同じ拡張機能で宣言されているか、異なる拡張機能で宣言されているかは関係ありません。
そのためには、`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`コンポーネントの型安全性を向上させることができます。