Stephen Jensen
03/16/2021, 3:49 AMUser
model where it can have friends who are also users.
About 5 months ago I saw a nice explanation by @Ryan where he said we could use the following model:
model User {
id String @id @default(cuid())
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
friends Relationship[]
}
model Relationship {
id String @id @default(cuid())
user User? @relation(fields: [userId], references: [id])
userId String?
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
}
I think the thing that would clear this up for me would be to see example prisma create commands that would show how to take 2 users and first create a relation from user1 -> user2
and then how to do the back relation. I'll start- thanks so much!
const user1 = await prisma.user.create({ data: { id: "1" } })
const user2 = await prisma.user.create({ data: { id: "2" } })
const relationship1To2 = await prisma.relationship.create({ //?? })
const relationship2To1 = await prisma.relationship.create({ //?? })
(My confusion stems from the fact that it seems like if we create a relationship where we set user1.id
to userId
, we will establish the relationship between user1->friendship
but not back to user2
.)Ryan
03/16/2021, 11:24 AMmodel User {
id Int @id @default(autoincrement())
name String
friends Friend[] @relation("friends")
fr Friend[] @relation("fr")
}
model Friend {
id Int @id @default(autoincrement())
user User? @relation("friends", fields: [userId], references: [id])
userId Int?
fr User? @relation("fr", fields: [frId], references: [id])
frId Int?
}
And then you can set the relationship as follows:
let user1 = await prisma.user.create({ data: { name: 'user 1' } })
let user2 = await prisma.user.create({ data: { name: 'user 2' } })
let user3 = await prisma.user.create({ data: { name: 'user 3' } })
await prisma.user.update({
where: { id: user1.id },
data: {
friends: {
create: [
{ fr: { connect: { id: user2.id } } },
{ fr: { connect: { id: user3.id } } },
],
},
},
})
await prisma.user.update({
where: { id: user2.id },
data: {
friends: {
create: [
{ fr: { connect: { id: user1.id } } },
{ fr: { connect: { id: user3.id } } },
],
},
},
})
The output will look something like this on querying for userโs friends:Stephen Jensen
03/16/2021, 2:35 PMfriends
and fr
and then essentially ignore the fr
field when you are trying to query for friends. Thanks so much for the awesome reply @Ryan! ๐Robert Witchell
04/08/2021, 4:01 AMRobert Witchell
04/08/2021, 4:09 AMRyan
04/08/2021, 7:28 AMRobert Witchell
04/17/2021, 4:04 AMRobert Witchell
04/17/2021, 4:06 AMmodel User {
id String @id @default(cuid())
firstName String?
lastName String?
username String? @unique
email String? @unique
createdAt DateTime @default(now())
updatedAt DateTime @default(now())
// Relational Mappings
following User[] @relation("UserFollows")
followedBy User[] @relation("UserFollows")
friendRequests User[] @relation("FriendRequests")
friendRequestRel User[] @relation("FriendRequests")
blockedUsers User[] @relation("BlockedUsers")
blockedUserRel User[] @relation("BlockedUsers")
friends User[] @relation("friends")
friendRelation User[] @relation("friends")