250313Note: Drizzle ORM 多对多关系
Drizzle ORM多对多关系建立
在 Drizzle ORM 中实现多对多关系,需要创建一个连接表来关联两个相关的表。具体步骤如下:
创建六个表:
表
a
表
b
连接表
a_b
定义
a
到b
的关系定义
b
到a
的关系在
a_b
表中管理a
和b
之间的关系
以下是如何在 users
和 groups
之间设置这种关系的示例:
实现步骤
定义主表
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)**:存储组信息。
定义连接表
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)**:用于存储用户和组之间的关联。
定义关系
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
是实现多对多关系的关键,包含引用users
和groups
主键的外键。复合主键:
userId
和groupId
的组合作为连接表的复合主键,确保每个用户与组的关联是唯一的。关系定义:通过定义关系,可以方便地查询相关数据。
这样设置可以有效地管理多对多关系,并进行涉及用户和组的复杂查询。
使用
记得引用到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 许可协议,转载请注明出处!
评论