メインコンテンツにスキップ

カスタムモデル

アプリケーションが成長するにつれて、関連するロジックをグループ化する必要が出てくる場合があります。以下のいずれかの方法をお勧めします。

  • Prisma Client拡張機能を使用した静的メソッドの作成
  • モデルをクラスでラップする
  • Prisma Clientモデルオブジェクトの拡張

Prisma Client拡張機能を使用した静的メソッド

次の例は、signUpおよびfindManyByDomainメソッドをUserモデルに追加するPrisma Client拡張機能を作成する方法を示しています。

import bcrypt from 'bcryptjs'
import { PrismaClient } from '@prisma/client'

const prisma = new PrismaClient().$extends({
model: {
user: {
async signUp(email: string, password: string) {
const hash = await bcrypt.hash(password, 10)
return prisma.user.create({
data: {
email,
password: {
create: {
hash,
},
},
},
})
},

async findManyByDomain(domain: string) {
return prisma.user.findMany({
where: { email: { endsWith: `@${domain}` } },
})
},
},
},
})

async function main() {
// Example usage
await prisma.user.signUp('user2@example2.com', 's3cret')

await prisma.user.findManyByDomain('example2.com')
}

モデルをクラスでラップする

以下の例では、Prisma Client内のuserモデルをUsersクラスでラップする方法を示します。

import { PrismaClient, User } from '@prisma/client'

type Signup = {
email: string
firstName: string
lastName: string
}

class Users {
constructor(private readonly prismaUser: PrismaClient['user']) {}

// Signup a new user
async signup(data: Signup): Promise<User> {
// do some custom validation...
return this.prismaUser.create({ data })
}
}

async function main() {
const prisma = new PrismaClient()
const users = new Users(prisma.user)
const user = await users.signup({
email: 'alice@prisma.io',
firstName: 'Alice',
lastName: 'Prisma',
})
}

この新しいUsersクラスを使用すると、signupのようなカスタム関数を定義できます。

上記の例では、Prisma Clientからsignupメソッドのみを公開していることに注意してください。Prisma ClientはUsersクラス内に隠されているため、findManyupsertのようなメソッドを呼び出すことはできなくなります。

このアプローチは、大規模なアプリケーションがあり、モデルができることを意図的に制限したい場合に適しています。

Prisma Clientモデルオブジェクトの拡張

しかし、既存の機能を隠したくないが、カスタム関数をグループ化したい場合はどうすればよいでしょうか?この場合、Object.assignを使用して、機能を制限せずにPrisma Clientを拡張できます。

import { PrismaClient, User } from '@prisma/client'

type Signup = {
email: string
firstName: string
lastName: string
}

function Users(prismaUser: PrismaClient['user']) {
return Object.assign(prismaUser, {
/**
* Signup the first user and create a new team of one. Return the User with
* a full name and without a password
*/
async signup(data: Signup): Promise<User> {
return prismaUser.create({ data })
},
})
}

async function main() {
const prisma = new PrismaClient()
const users = Users(prisma.user)
const user = await users.signup({
email: 'alice@prisma.io',
firstName: 'Alice',
lastName: 'Prisma',
})
const numUsers = await users.count()
console.log(user, numUsers)
}

これで、カスタムのsignupメソッドをcountupdateManygroupBy()、およびPrisma Clientが提供する他のすべての素晴らしいメソッドと一緒に使用できます。何よりも、すべてタイプセーフです!

さらに進む

Prisma Client拡張機能を使用して、カスタムモデルメソッドでモデルを拡張することをお勧めします。