You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 05:46:02