Self-relations (Prisma ORM v7) (/docs/orm/v7/prisma-schema/data-model/relations/self-relations)
For the complete Prisma documentation index, see llms.txt. A markdown version of any docs page is available by appending
.mdto its URL.
How to define and work with self-relations in Prisma.
Location: ORM > v7 > Prisma Schema > Data Model > Relations > Self-relations
A relation field can reference its own model, called a self-relation. Self-relations can be 1-1, 1-n, or m-n.
[!NOTE] Self-relations always require the
@relationattribute.
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")
}Related pages
Section titled “Related pages”Many-to-many relations: How to define and work with many-to-many relations in Prisma.One-to-many relations: How to define and work with one-to-many relations in Prisma.One-to-one relations: How to define and work with one-to-one relations in Prisma.Referential actions: Referential actions let you define the update and delete behavior of related models on the database levelRelation mode: Manage relations between records with relation modes in Prisma