使用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
相关产品推荐
相关产品推荐

