Prisma数据模型中用户关注关系的逻辑解析及关系类型确认咨询
Prisma数据模型中用户关注关系的逻辑解析及关系类型确认咨询
嗨,我来帮你拆解这个困惑!先别被字段名和关系名的对应搞晕,咱们一步步理清楚:
一、关系名称的对应逻辑
首先要明确:Prisma里的@relation("关系名")是用来关联模型之间双向关系的标识,不是看字段名,而是看这个关系名是否匹配。咱们结合你的代码来看:
先看Follow中间表的定义:
model Follow { id Int @id @default(autoincrement()) follower User @relation("Follower", fields: [followerId], references: [id]) followerId Int following User @relation("Following", fields: [followingId], references: [id]) followingId Int @@unique([followerId, followingId]) }
这里的两个@relation分别定义了两个双向关系:
follower字段的@relation("Follower"):表示这条Follow记录里的follower(关注者),对应的是User模型里标记了@relation("Follower")的字段following字段的@relation("Following"):表示这条Follow记录里的following(被关注者),对应的是User模型里标记了@relation("Following")的字段
再看User模型的关联字段:
model User { id Int @id @default(autoincrement()) username String @unique // ... other user properties followers User[] @relation("Following") following User[] @relation("Follower") }
现在对应起来就清晰了:
followers User[] @relation("Following"):这个字段关联的是Follow模型里@relation("Following")的following字段。逻辑上,当你查询一个User的followers时,Prisma会去找所有Follow记录中followingId等于当前User id的记录,然后取出这些记录里的follower(也就是关注当前用户的人),所以这个字段叫followers是完全符合业务逻辑的。following User[] @relation("Follower"):这个字段关联的是Follow模型里@relation("Follower")的follower字段。查询时,Prisma会找所有Follow记录中followerId等于当前User id的记录,取出这些记录里的following(也就是当前用户关注的人),所以命名为following也完全合理。
简单说:关系名是Prisma内部用来绑定双向关联的“暗号”,字段名是贴合你业务逻辑的命名,两者不用完全一致,只要关系名匹配就行。
二、关系类型确认
这个模型实现的是多对多关系:
- 一个用户可以关注多个其他用户(
following字段是数组) - 一个用户可以被多个其他用户关注(
followers字段是数组)
你这里用的是Prisma的显式多对多关系(自己定义了中间表Follow),相比Prisma自动生成的隐式多对多,这种方式的好处是可以在中间表添加额外字段(比如关注时间createdAt、是否悄悄关注等),灵活性更高。
如果是隐式多对多,你只需要在User模型里写followers User[] @relation("FollowRelation")和following User[] @relation("FollowRelation"),Prisma会自动生成中间表,但没法自定义中间表的字段。
备注:内容来源于stack exchange,提问作者Aashish Aggarwal
相关产品推荐
相关产品推荐

