Filter on many to many relationship
I want to find all sites where a user is a member in.
I have 3 tables that I have setup relations between
Now I am trying to figure out how to query all sites where user with a specific ID is a member in.
But when I do the following query, I just get all sites but with an empty array for the sites where the user is not a member in. My goal is to only get the sites where the user is a member in.
How can I query this?
I have 3 tables that I have setup relations between
export const users = pgTable("users", {
id: text("id").primaryKey(),
name: text("name"),
email: text("email").unique(),
avatarUrl: text('avatar_url')
});
export const sites = pgTable("sites", {
id: serial("id").primaryKey(),
createdAt: timestamp('created_at', {
withTimezone: true
}).defaultNow(),
uuid: uuid('uuid').defaultRandom(),
name: text("name").notNull(),
slug: text("slug").unique().notNull()
});
export const usersRelations = relations(users, ({ many }) => ({
sites: many(siteMembers),
}));
export const sitesRelations = relations(sites, ({ many }) => ({
members: many(siteMembers),
}));
export const siteMembers = pgTable('site_members', {
siteId: integer('site_id').references(() => sites.id, { onDelete: 'cascade' }),
userId: text("user_id").notNull().references(() => users.id, { onDelete: 'cascade' })
}, (table) => {
return {
pk: primaryKey(table.siteId, table.userId),
}
});
export const userSiteMembersRelations = relations(siteMembers, ({ one }) => ({
sites: one(sites, {
fields: [siteMembers.siteId],
references: [sites.id],
}),
user: one(users, {
fields: [siteMembers.userId],
references: [users.id],
}),
}));export const users = pgTable("users", {
id: text("id").primaryKey(),
name: text("name"),
email: text("email").unique(),
avatarUrl: text('avatar_url')
});
export const sites = pgTable("sites", {
id: serial("id").primaryKey(),
createdAt: timestamp('created_at', {
withTimezone: true
}).defaultNow(),
uuid: uuid('uuid').defaultRandom(),
name: text("name").notNull(),
slug: text("slug").unique().notNull()
});
export const usersRelations = relations(users, ({ many }) => ({
sites: many(siteMembers),
}));
export const sitesRelations = relations(sites, ({ many }) => ({
members: many(siteMembers),
}));
export const siteMembers = pgTable('site_members', {
siteId: integer('site_id').references(() => sites.id, { onDelete: 'cascade' }),
userId: text("user_id").notNull().references(() => users.id, { onDelete: 'cascade' })
}, (table) => {
return {
pk: primaryKey(table.siteId, table.userId),
}
});
export const userSiteMembersRelations = relations(siteMembers, ({ one }) => ({
sites: one(sites, {
fields: [siteMembers.siteId],
references: [sites.id],
}),
user: one(users, {
fields: [siteMembers.userId],
references: [users.id],
}),
}));Now I am trying to figure out how to query all sites where user with a specific ID is a member in.
But when I do the following query, I just get all sites but with an empty array for the sites where the user is not a member in. My goal is to only get the sites where the user is a member in.
How can I query this?
await db.query.sites.findMany({
with: {
members: {
where: (members, { eq }) => eq(members.userId, user.id)
},
}
})await db.query.sites.findMany({
with: {
members: {
where: (members, { eq }) => eq(members.userId, user.id)
},
}
})