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

計算フィールド

計算フィールドを使用すると、既存のデータに基づいて新しいフィールドを導出できます。一般的な例として、フルネームを計算したい場合が挙げられます。データベースにはファーストネームとラストネームのみを保存していても、それらを組み合わせてフルネームを計算する関数を定義できます。計算フィールドは読み取り専用であり、データベースではなくアプリケーションのメモリに保存されます。

Prisma Client拡張機能の使用

次の例は、PrismaスキーマのUserモデルに、実行時にfullName計算フィールドを追加するPrisma Client拡張機能を作成する方法を示しています。

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()
表示CLI結果

計算フィールドは型安全であり、連結された値から複雑なオブジェクト、またはモデルのインスタンスメソッドとして機能する関数まで、あらゆるものを返すことができます。

Prisma ORM 4.16.0以前の手順
警告

Prisma ORMバージョン4.16.0以降でPrisma Client拡張機能が一般提供されるようになったため、以下の手順は推奨されません。この目的を達成するには、クライアント拡張機能を使用してください。

Prisma Clientはまだ計算フィールドをネイティブでサポートしていませんが、ジェネリック型を入力として受け入れ、そのジェネリックを特定の構造に準拠させるように拡張する関数を定義できます。最後に、そのジェネリックに追加の計算フィールドを付けて返すことができます。それがどのように見えるか見てみましょう。

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

上記のTypeScriptの例では、FirstLastName型を拡張するUserジェネリックが定義されています。これは、computeFullNameに渡すものがfirstNamelastNameキーを含んでいなければならないことを意味します。

また、WithFullName<User>という戻り値の型も定義されており、これはUserが何であれ、fullName文字列属性を追加します。

この関数を使えば、firstNamelastNameキーを含むどんなオブジェクトでもfullNameを計算できます。なかなかいいでしょう?

さらに進む

  • スキーマに計算フィールドを追加するためにPrisma Client拡張機能をどのように使用できるか学びましょう —
  • computeFullName関数をカスタムモデルに移動する方法を学びましょう。
  • Prisma Clientにネイティブサポートを追加するための機能リクエストが公開されています。それが実現してほしい場合は、そのissueに賛成票を投じ、ユースケースを共有してください!
© . All rights reserved.