計算フィールド
計算フィールドを使用すると、既存のデータに基づいて新しいフィールドを導出できます。一般的な例として、フルネームを計算したい場合が挙げられます。データベースにはファーストネームとラストネームのみを保存していても、それらを組み合わせてフルネームを計算する関数を定義できます。計算フィールドは読み取り専用であり、データベースではなくアプリケーションのメモリに保存されます。
Prisma Client拡張機能の使用
次の例は、PrismaスキーマのUser
モデルに、実行時にfullName
計算フィールドを追加するPrisma Client拡張機能を作成する方法を示しています。
- Prisma Client拡張機能
- Prismaスキーマ
import { PrismaClient } from '@prisma/client'
const prisma = new PrismaClient().$extends({
result: {
user: {
fullName: {
needs: { firstName: true, lastName: true },
compute(user) {
return `${user.firstName} ${user.lastName}`
},
},
},
},
})
async function main() {
/**
* Example query containing the `fullName` computed field in the response
*/
const user = await prisma.user.findFirst()
}
main()
datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
}
generator client {
provider = "prisma-client-js"
}
model User {
id Int @id @default(autoincrement())
email String @unique
firstName String
lastName String
posts Post[]
}
model Post {
id Int @id @default(autoincrement())
title String
published Boolean @default(true)
content String?
authorId Int?
author User? @relation(fields: [authorId], references: [id])
}
計算フィールドは型安全であり、連結された値から複雑なオブジェクト、またはモデルのインスタンスメソッドとして機能する関数まで、あらゆるものを返すことができます。
Prisma ORM 4.16.0以前の手順
Prisma ORMバージョン4.16.0以降でPrisma Client拡張機能が一般提供されるようになったため、以下の手順は推奨されません。この目的を達成するには、クライアント拡張機能を使用してください。
Prisma Clientはまだ計算フィールドをネイティブでサポートしていませんが、ジェネリック型を入力として受け入れ、そのジェネリックを特定の構造に準拠させるように拡張する関数を定義できます。最後に、そのジェネリックに追加の計算フィールドを付けて返すことができます。それがどのように見えるか見てみましょう。
- TypeScript
- JavaScript
// Define a type that needs a first and last name
type FirstLastName = {
firstName: string
lastName: string
}
// Extend the T generic with the fullName attribute
type WithFullName<T> = T & {
fullName: string
}
// Take objects that satisfy FirstLastName and computes a full name
function computeFullName<User extends FirstLastName>(
user: User
): WithFullName<User> {
return {
...user,
fullName: user.firstName + ' ' + user.lastName,
}
}
async function main() {
const user = await prisma.user.findUnique({ where: 1 })
const userWithFullName = computeFullName(user)
}
function computeFullName(user) {
return {
...user,
fullName: user.firstName + ' ' + user.lastName,
}
}
async function main() {
const user = await prisma.user.findUnique({ where: 1 })
const userWithFullName = computeFullName(user)
}
上記のTypeScriptの例では、FirstLastName
型を拡張するUser
ジェネリックが定義されています。これは、computeFullName
に渡すものがfirstName
とlastName
キーを含んでいなければならないことを意味します。
また、WithFullName<User>
という戻り値の型も定義されており、これはUser
が何であれ、fullName
文字列属性を追加します。
この関数を使えば、firstName
とlastName
キーを含むどんなオブジェクトでもfullName
を計算できます。なかなかいいでしょう?
さらに進む
- スキーマに計算フィールドを追加するためにPrisma Client拡張機能をどのように使用できるか学びましょう — 例。
computeFullName
関数をカスタムモデルに移動する方法を学びましょう。- Prisma Clientにネイティブサポートを追加するための機能リクエストが公開されています。それが実現してほしい場合は、そのissueに賛成票を投じ、ユースケースを共有してください!