使用Drizzle ORM关联users与contacts表时出现关系推断错误求助
修复Drizzle ORM用户与联系人关联查询的错误
你当前的代码在查询用户关联联系人时出现There is not enough information to infer relation "users.contacts"错误,问题出在关联关系的定义不匹配,具体修复点如下:
错误原因
- 联系人表
contacts的关系定义逻辑错误:一个联系人只能属于一个用户,你用了many(users),会让Drizzle认为一个联系人对应多个用户,和实际的一对多逻辑完全相反 - 用户表
users的contacts关联缺少明确的字段映射,Drizzle无法自动识别关联的外键关系
修复步骤
1. 修正联系人表的关系定义
把contactsRelations里的many(users)改成one(users),并明确指定关联字段,同时保持和用户表一致的关联名称:
export const contactsRelations = relations(contacts, ({ one }) => ({ user: one(users, { fields: [contacts.user_email], references: [users.email], relationName: 'users_contacts' }) }));
2. 完善用户表的联系人关联定义
在用户表的contacts关联中,补充字段映射信息,让Drizzle能准确识别关联逻辑:
export const usersRelations = relations(users, ({ one, many }) => ({ permission: one(permissions, { fields: [users.email], references: [permissions.user_email] }), contacts: many(contacts, { relationName: 'users_contacts', fields: [users.email], references: [contacts.user_email] }) }));
3. 修正联系人表的外键约束
你给contacts.user_email加了unique()约束,这会导致一个用户只能有一个联系人,和你设计的一个用户对应多个联系人逻辑冲突,需要去掉该约束:
export const contacts = pgTable("contacts", { id: uuid("id").defaultRandom().primaryKey(), type: contactType("type").default("phone").notNull(), value: text("value").notNull(), created_at: timestamp("created_at").defaultNow(), user_email: text("user_email") .references(() => users.email, { onDelete: "cascade", onUpdate: "cascade" }) .notNull() // 移除unique()约束 });
验证修复后的查询
现在执行你的查询代码应该就能正常返回包含联系人的用户数据了:
const workspaceUsers = await db.query.users.findMany({ where: eq(users.workspace_id, loggedWorkspace.data.id), with: { permission: true, contacts: true } });
内容的提问来源于stack exchange,提问作者Sujjeee
相关产品推荐
相关产品推荐

