Self-relations
Source URL: https://docs.prisma.io/docs/orm/prisma-schema/data-model/relations/self-relations
Self-relations
Section titled “Self-relations”How to define and work with self-relations in Prisma.
A relation field can reference its own model, called a self-relation. Self-relations can be 1-1, 1-n, or m-n.
Self-relations always require the @relation attribute.
One-to-one self-relations
Section titled “One-to-one self-relations” model User { id Int @id @default(autoincrement()) name String? successorId Int? @unique successor User? @relation("BlogOwnerHistory", fields: [successorId], references: [id]) predecessor User? @relation("BlogOwnerHistory") }This expresses:
- A user can have zero or one predecessor
- A user can have zero or one successor
Key rules:
- Both sides must use the same
@relationname - One side must be fully annotated with
fieldsandreferences - The foreign key needs
@uniquefor 1-1 - Cannot be required on both sides (impossible to create first record)
One-to-many self relations
Section titled “One-to-many self relations” model User { id Int @id @default(autoincrement()) name String? teacherId Int? teacher User? @relation("TeacherStudents", fields: [teacherId], references: [id]) students User[] @relation("TeacherStudents") }This expresses:
- A user has zero or one teacher
- A user can have zero or more students
No @unique constraint on teacherId - multiple students can share the same teacher.
Many-to-many self relations
Section titled “Many-to-many self relations” model User { id Int @id @default(autoincrement()) name String? followedBy User[] @relation("UserFollows") following User[] @relation("UserFollows") }This expresses:
- A user can be followed by zero or more users
- A user can follow zero or more users
For relational databases, this is an implicit m-n (Prisma manages the relation table).
Explicit version (for storing additional fields):
model User { id Int @id @default(autoincrement()) name String? followedBy Follows[] @relation("followedBy") following Follows[] @relation("following") }
model Follows { followedBy User @relation("followedBy", fields: [followedById], references: [id]) followedById Int following User @relation("following", fields: [followingId], references: [id]) followingId Int @@id([followingId, followedById]) }Multiple self-relations on same model
Section titled “Multiple self-relations on same model”You can combine multiple self-relations:
model User { id Int @id @default(autoincrement()) name String? teacherId Int? teacher User? @relation("TeacherStudents", fields: [teacherId], references: [id]) students User[] @relation("TeacherStudents") followedBy User[] @relation("UserFollows") following User[] @relation("UserFollows") }