跳到主要內容

自定義模型

隨著應用程式的增長,您可能會發現需要將相關邏輯分組在一起。我們建議以下任一方式:

使用 Prisma Client 擴充套件的靜態方法

以下示例演示瞭如何建立一個 Prisma Client 擴充套件,為 User 模型新增 signUpfindManyByDomain 方法。

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 擴充套件來擴充套件您的模型,透過自定義模型方法

© . This site is unofficial and not affiliated with Prisma Data, Inc.