如何用Drizzle基于关联字段查询?多表关联场景求助
解决多对多关系下的用户筛选问题
你的问题出在原代码的过滤逻辑只作用于关联返回的organisationToUsers数据,并没有限制主查询的用户是否符合组织归属条件——哪怕用户没有匹配的组织关联,只要邮箱符合就会被返回。
要实现同时匹配邮箱和指定组织ID的用户筛选,需要在主查询的where条件里加入关联检查,确保用户存在对应的组织关联记录。用Drizzle ORM的话,可以通过exists子查询来实现:
import { and, eq, exists, select } from 'drizzle-orm'; const targetOrgId = '你的目标organisationId'; const userEmail = ctx.session?.user.email || ''; const userData = await db.query.user.findFirst({ where: and( // 匹配指定邮箱 eq(user.email, userEmail), // 检查用户是否关联了目标组织 exists( select() .from(organisationToUser) .where(and( eq(organisationToUser.userId, user.id), eq(organisationToUser.organisationId, targetOrgId) )) ) ), // 如果需要返回用户关联的该组织信息,可以保留以下with配置 with: { organisationToUsers: { with: { organisation: true, }, where: eq(organisationToUser.organisationId, targetOrgId), }, }, });
逻辑说明
and函数将邮箱匹配和组织关联检查两个条件组合,只有同时满足才会返回用户exists子查询会验证当前用户在OrganisationToUser表中存在对应organisationId的记录,确保用户属于目标组织- 保留
with配置可以同时返回用户关联的目标组织信息,不需要的话可以直接去掉
内容的提问来源于stack exchange,提问作者THpubs
相关产品推荐
相关产品推荐

