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

使用Drizzle ORM关联查询用户权限报错的问题排查

Drizzle ORM关联查询报错:Cannot read properties of undefined (reading 'referencedTable')

问题场景

在Next.js项目中使用Drizzle ORM + Supabase查询用户及其关联权限数据时,添加with关联选项后触发以下错误:

Error: Cannot read properties of undefined (reading 'referencedTable')

移除with: { permissions: true }后查询可正常执行,但无法获取关联的权限数据。

相关代码

Schema定义

export const users = pgTable("users", {
  id: uuid("id").primaryKey().notNull(),
  fullName: text("full_name"),
  avatarUrl: text("avatar_url"),
  email: text("email"),
  workspaceId: uuid("workspace_id"),
})

export const permissions = pgTable("permissions", {
  id: uuid("id").defaultRandom().primaryKey().notNull(),
  userId: uuid("user_id")
    .notNull()
    .references(() => users.id, { onDelete: "cascade" }),
  userCanViewKbase: boolean("user_can_view_kbase"),
  userCanManageContent: boolean("user_can_manage_content"),
  userCanViewWorkspaceSettings: boolean("user_can_view_workspace_settings"),
})

export const userRelations = relations(users, ({ one }) => ({
  permission: one(permissions, {
    fields: [users.id],
    references: [permissions.userId],
  }),
}))

查询函数

"use server"

// Next
import { cookies } from "next/headers"

// Auth
import { createClient } from "@/lib/supabase/server"
import db from "@/lib/supabase/db"

export default async function readUser() {
  const cookieStore = cookies()
  const supabase = createClient(cookieStore)

  const {
    data: { user: authUser },
  } = await supabase.auth.getUser()

  if (!authUser) {
    return null
  }

  const user = await db.query.users.findFirst({
    where: (users, { eq }) => eq(users.id, authUser?.id || ""),
    with: {
      permissions: true,
    },
  })

  console.log(user)

  return user
}

修复方案

1. 修正关联名称不匹配问题

你在userRelations中定义的关联名称是**permission(单数),但查询时with选项里用的是permissions(复数)**,Drizzle无法匹配到对应关系,导致报错。

你可以选择两种修正方式:

  • 方式一:修改关系定义的名称为复数,匹配查询中的写法:
    export const userRelations = relations(users, ({ one }) => ({
      permissions: one(permissions, {
        fields: [users.id],
        references: [permissions.userId],
      }),
    }))
    
  • 方式二:修改查询中的with选项,匹配关系定义的单数名称:
    const user = await db.query.users.findFirst({
      where: (users, { eq }) => eq(users.id, authUser?.id || ""),
      with: {
        permission: true,
      },
    })
    

2. 验证关联关系的合理性(可选)

如果业务场景中一个用户对应多条权限记录,应该将one改为many:

export const userRelations = relations(users, ({ many }) => ({
  permissions: many(permissions),
}))

这种情况下查询时with: { permissions: true }的写法就完全匹配了。

3. 额外检查

  • 确保userRelations已正确导入到Drizzle数据库实例(db对象)中,否则Drizzle无法识别关联关系。
  • 确认数据库中permissions表的user_id字段存在与当前用户id匹配的记录。

内容的提问来源于stack exchange,提问作者Mathias Riis Sorensen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 16:23:26