250313Note: Drizzle ORM 多对多关系

March 13, 2025 / Administrator / 14阅读 / 0评论 / 分类: fenextjs

Drizzle ORM多对多关系建立

在 Drizzle ORM 中实现多对多关系,需要创建一个连接表来关联两个相关的表。具体步骤如下:

  1. 创建六个表:

    • a

    • b

    • 连接表 a_b

    • 定义 ab 的关系

    • 定义 ba 的关系

    • a_b 表中管理 ab 之间的关系

以下是如何在 usersgroups 之间设置这种关系的示例:

实现步骤

  1. 定义主表

import { serial, text, pgTable } from 'drizzle-orm/pg-core';

export const users = pgTable('users', {
  id: serial('id').primaryKey(),
  name: text('name'),
});
export const groups = pgTable('groups', {
  id: serial('id').primaryKey(),
  name: text('name'),
});
- **用户表(Users)**:存储用户信息。
- **组表(Groups)**:存储组信息。
  1. 定义连接表

import { integer, primaryKey } from 'drizzle-orm/pg-core';

export const usersToGroups = pgTable('users_to_groups', {
  userId: integer('user_id')
    .notNull()
    .references(() => users.id),
  groupId: integer('group_id')
    .notNull()
    .references(() => groups.id),
}, (t) => [
  primaryKey({ columns: [t.userId, t.groupId] })
]);
- **用户组连接表(UsersToGroups)**:用于存储用户和组之间的关联。
  1. 定义关系

import { relations } from 'drizzle-orm';

export const usersRelations = relations(users, ({ many }) => ({
  usersToGroups: many(usersToGroups),
}));
export const groupsRelations = relations(groups, ({ many }) => ({
  usersToGroups: many(usersToGroups),
}));
export const usersToGroupsRelations = relations(usersToGroups, ({ one }) => ({
  user: one(users, {
    fields: [usersToGroups.userId],
    references: [users.id],
  }),
  group: one(groups, {
    fields: [usersToGroups.groupId],
    references: [groups.id],
  }),
}));
- **用户关系(Users Relations)**:定义用户与连接表之间的关系。
- **组关系(Groups Relations)**:定义组与连接表之间的关系。
- **连接表关系(UsersToGroups Relations)**:定义连接表与用户和组之间的关系。

关键点

  • 连接表users_to_groups 是实现多对多关系的关键,包含引用 usersgroups 主键的外键。

  • 复合主键userIdgroupId 的组合作为连接表的复合主键,确保每个用户与组的关联是唯一的。

  • 关系定义:通过定义关系,可以方便地查询相关数据。

这样设置可以有效地管理多对多关系,并进行涉及用户和组的复杂查询。

使用

记得引用到db对象里

export const db = getDbInstance(neon(process.env.DATABASE_URL!,
      { schema: { ...schema, ...relations } }););

Drizzle 深层引用导致的typescript推理错误

通过drizzle查询到某个数据表数据,数据结构和数据库模型定义是一样的,但是通过关系引用得到另一个表的数据,同时保留在原有的结构上,这和数据库模型定义就不一样,ts就会报错;

具体来说:

// 定义自定义类型
type CustomType = {
  id: string;
  name: string;
  nested: {
    field: string;
    subNested: {
      subField: string;
    };
  }[];
};

// 查询配置
const result = await db.query.table.findMany({
  with: {
    nested: {
      with: {
        subNested: {
          columns: { subField: true }
        }
      }
    }
  }
} as const);

// 使用类型断言处理结果
const processedResult = result.map(item => ({
  id: item.id,
  name: item.name,
  nested: (item as unknown as CustomType).nested.map(n => `${n.subNested.subField}`)
}));

Ant Design Ratio.Group defaultValue 在受控组件中无效

把defaultValue从radio去了,加到最外面的form标签里

//before
<Radio.Group defaultValue=""></Radio.Group>

//after
<Form initialValues={{xxx: 'xxx'}}></Form>

#drizzle(1)

文章作者:Administrator

文章链接:http://halo.chenkeyan.com/archives/note-drizzle-orm-many-to-many

版权声明:本博客所有文章除特别声明外,均采用CC BY-NC-SA 4.0 许可协议,转载请注明出处!


评论