如何使用Drizzle声明和查询关系?

问题描述 投票:0回答:1

我有一个 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,
    },

你能发现我在这里做错了什么吗?

next.js supabase drizzle
1个回答
0
投票

您的架构定义了一个名为

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,
    },
  })
© www.soinside.com 2019 - 2024. All rights reserved.