'Filtering on related tables using Prisma and Postgres
I have a Prisma model for a Postgres database with a User that can belong to many Organisations, and organizations that can have many users. So I've created a typical many-to-many relationship.
model Organization {
organizationId Int @id @default(autoincrement())
slug String @unique
name String
users UserInOrganization[]
}
model User {
userId Int @id @default(autoincrement())
name String
organizations UserInOrganization[]
}
model UserInOrganization {
fkOrganizationId Int
fkUserId Int
organization Organization @relation(fields: [fkOrganizationId], references: [organizationId], onDelete: Cascade)
user User @relation(fields: [fkUserId], references: [userId], onDelete: Cascade)
role Role @relation(fields: [fkRoleId], references: [roleId])
@@id([fkOrganizationId, fkUserId])
}
Next, I need to get all the organizations for a specific user and slug.
If I'd write it in SQL I'd do something like:
select o.name, u."userId" from "Organization" as o
join "UserInOrganization" as uio on o."organizationId" = uio."fkOrganizationId"
join "User" as u on u."userId" = uio."fkUserId"
where u."userId" = 1 and o.slug='slug'
But what would that be in Prisma? Doing something like below seems to give me all the organizations matching the slug (not considering the where on the userId). The where-clause is just filtering the users for each organization. 🥺
const organization = await prisma.organization.findUnique({
where: { slug: slug },
select: {
name: true,
users: { where: { user: { userId: userId } } },
},
});
How can I get just the organizations that have the actual userId?
Solution 1:[1]
You can use include with nested select to get organisations that match slug and userId.
Here's the query for it:
const organization = await prisma.organization.findUnique({
where: {
slug: 'prisma',
},
include: {
users: {
where: {
user: {
userId: 1,
},
},
select: {
user: true,
},
},
},
});
console.log(JSON.stringify(organization, null, 2));
Here's the output:
{
"organizationId": 1,
"slug": "prisma",
"name": "Prisma",
"users": [
{
"user": {
"userId": 1,
"name": "John Doe"
}
}
]
}
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 | Nurul Sundarani |
