我有一个 Next.js 项目,我想使用 Drizzle ORM 和 Supabase 查询用户的权限。当我尝试将
with
添加到查询中时,如here所述,我不断收到以下错误。
错误信息:
Error: Cannot read properties of undefined (reading 'referencedTable')
这是我的架构,我尝试使用 userId 和 userRelations 函数创建引用来定义关系。
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],
}),
}))
然后我使用以下内容创建了一个 readUser 函数:
"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
}
如果我删除以下内容,查询将有效,但与权限无关:
with: {
permissions: true,
},
你能发现我在这里做错了什么吗?
您的架构定义了一个名为
permission
的命名关系,并且您的查询正在使用名为 permissions
的命名关系。由于用户只有一项权限,我建议更新您的查询以使用 permission
。
以下片段来自您的架构定义。这里,
permission
是单数:
export const userRelations = relations(users, ({ one }) => ({
permission: one(permissions, {
fields: [users.id],
references: [permissions.userId],
}),
}))
修复:在查询中,您需要使用相同的命名关系。使用
permission: true
。
const user = await db.query.users.findFirst({
where: (users, { eq }) => eq(users.id, authUser?.id || ""),
with: {
permission: true,
},
})