apps/docs/content/docs/orm/prisma-schema/data-model/relations/self-relations.mdx
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 @relation attribute.
:::
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:
Key rules:
@relation namefields and references@unique for 1-1model User {
id Int @id @default(autoincrement())
name String?
teacherId Int?
teacher User? @relation("TeacherStudents", fields: [teacherId], references: [id])
students User[] @relation("TeacherStudents")
}
This expresses:
No @unique constraint on teacherId - multiple students can share the same teacher.
model User {
id Int @id @default(autoincrement())
name String?
followedBy User[] @relation("UserFollows")
following User[] @relation("UserFollows")
}
This expresses:
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])
}
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")
}