You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 05:07:03