多对多自关系 Prisma - 一个字段

2024-02-22

我正在尝试使用 Prisma 和其他工具为我的应用程序创建一个友谊机制。在文档中,它显示了以下示例,说明如何创建多对多自关系:

model User {
  id         Int       @id @default(autoincrement())
  name       String?
  followedBy Follows[] @relation("following")
  following  Follows[] @relation("follower")
}

model Follows {
  follower    User @relation("follower", fields: [followerId], references: [id])
  followerId  Int
  following   User @relation("following", fields: [followingId], references: [id])
  followingId Int

  @@id([followerId, followingId])
}

我已经实现了这个并且它有效,但是问题是对于友谊来说,没有“关注”和“跟随者”,你们只是朋友。目前,当我查询时,我必须查询这两个字段才能找到用户的所有朋友。有没有办法只用一个字段来定义这种类型的关系?那么我们只有一个用户的好友列表吗?


我同意,如果 Prisma 能够更原生地支持这种关系应该是对称的自我关系(例如,当且仅当 userB 是 userA 的朋友时,userA 是 userB 的朋友),那就太好了。

然而,据我所知,Prisma 坚持认为这种关系有两个“方面”。 (如果有人更了解,我很想听听!)因此,接下来是我正在采取的方法,它避免了必须查询这两个关系才能找到用户的完整朋友集。

Concept

  1. 我们将使用关系的一个“侧面”来包含完整的朋友集。另一“面”的存在只是为了满足 Prisma 的要求,我们永远不会直接查询它。

  2. 添加或删除好友关系时,我们将进行两次 prisma 调用,一次更新每个对象。

Code

架构文件:

model User {
  id         Int       @id @default(autoincrement())
  name       String?
  friends    User[]    @relation("UserFriends")

  // This second "side" of the UserFriends relation exists solely 
  // to satisfy prisma's requirements; we won't access it directly.
  symmetricFriends  User[] @relation("UserFriends")
}

添加和删​​除好友的方法(这里有很多多余的代码可以抽象出来,但我认为这样读起来更清楚):

const addFriendship = async (userIdA: string, userIdB: string) => {
  await prisma.user.update({
    where: {id: userIdA},
    data: {friends: {connect: [{id: userIdB}]}},
  });
  await prisma.user.update({
    where: {id: userIdB},
    data: {friends: {connect: [{id: userIdA}]}},
  });
};

const removeFriendship = async (userIdA: string, userIdB: string) => {
  await prisma.user.update({
    where: {id: userIdA},
    data: {friends: {disconnect: [{id: userIdB}]}},
  });
  await prisma.user.update({
    where: {id: userIdB},
    data: {friends: {disconnect: [{id: userIdA}]}},
  });
}

通过这种方法,人们可以加载用户并以预期的方式获取他们的所有朋友,例如

const getUserWithFriends = async (userId) => 
  await prisma.user.find({
    where: {id: userId},
    include: {friends: true},
  });
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

多对多自关系 Prisma - 一个字段 的相关文章

  • 在 Symfony2 中将多对多关系保存到数据库

    在我的 Symfony2 项目中 我有两个相关的实体 用户和收藏夹 他们之间是多对多的关系 我的应用程序的工作原理如下 在我的 Twig 页面中 我有一些带有 添加到收藏夹 按钮的项目 当您单击该按钮时 我的控制器会将 item id 保存
  • 您将如何设计数据库以允许用户定义模式[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 如果您必须创建一个应用程序 例如博客应用程序 那么创建数据库模式相对简单 你必须创建一些表 tblPosts tblAttachments tb
  • Rails 中的奇怪错误 - 缺少助手

    我不确定 但这可能与崩溃的计算机有关 重新启动后 崩溃后 我收到丢失助手错误 其中助手名称错误 切换分支对结果没有影响 错误是 缺少帮助程序文件 helpers users xxxx sites xxxx app helpers accou
  • 在java中以编程方式生成XSD

    是否有任何API可以在java中以编程方式生成XSD 我需要从 Json Schema 生成 XSD 我将阅读 Json Schema 并根据我在解析过程中遇到的元素需要创建适当的 XSD 元素 因此 如果有任何可以支持 XSD 元素的 A
  • NHibernate 中的有序多对多关系

    假设我有两个类 Item 和 ItemCollection 其中 ItemCollection 包含一个ordered具有索引的 Item 对象列表 即列表按用户指定的方式排序 我们还假设它们具有多对多关系 一个 ItemCollectio
  • “任何一个或多个这些元素但必须至少有一个”的 XML 模式构造

    我正在尝试设置类似于 序列 的模式的一部分 其中所有子元素都是可选的 但至少有一个元素must存在 并且可能不止一个 我尝试执行以下操作 但 XMLSpy 抱怨 内容模型包含无法唯一确定的元素 和
  • Django 如何从 ManyToManyField 序列化并列出全部

    我正在使用 Django 1 9 1 开发移动应用程序后端 我实现了关注者模型 现在我想列出用户的所有关注者 但目前我不得不这样做 我还使用 Django Rest 框架 这是我的 UserProfile 模型 class UserProf
  • TSQL 定义临时表(或表变量)而不定义架构?

    有没有一种方法可以定义临时表而无需预先定义其架构 实际上 使用表 VARIABLE 内存表 是最佳方法 table 在临时数据库中创建一个表 而 table 是全局的 两者都具有磁盘命中 考虑交易数量所经历的放缓 打击 CREATE PRO
  • 基本的多对多sql选择查询

    我认为这应该很容易 但它却在逃避我 我的帐户和帐户组之间存在多对多关系 一个帐户可以位于零个或多个组中 因此我使用标准连接表 Accounts ID BankName AcctNumber Balance AccountGroups ID
  • 如何将表移动到 T-SQL 中的架构中

    我想使用 T SQL 将表移动到特定架构中 我正在使用 SQL Server 2008 ALTER SCHEMA TargetSchema TRANSFER SourceSchema TableName 如果你想搬家all表到一个新的模式
  • 如何使 Django ManyToMany “直通”查询更加高效?

    我使用的是 ManyToManyField 和 through 类 这会在获取事物列表时产生大量查询 我想知道是否有更有效的方法 例如 这里有一些描述书籍及其几位作者的简化类 它们通过角色类 定义 编辑器 插画家 等角色 class Per
  • Oracle:如何查找模式中上次更新(任何表)的时间戳?

    有一个Oracle数据库模式 数据很小 但仍然有10 15个表左右 它包含一种配置 路由表 有一个应用程序必须不时轮询此架构 不得使用通知 如果架构中没有数据更新 应用程序应使用其当前的内存版本 如果任何表有任何更新 应用程序应将所有表重新
  • XML 模式不区分大小写的简单类型字符串枚举

    我的 XML 架构 xsd 文件中需要不区分大小写的字符串枚举类型 我可以通过执行以下操作来不区分大小写
  • 在 Prisma 中更新多对多关系

    我正在尝试找出实现以下架构的更新插入 更新的正确方法 model Post author String Id lastUpdated DateTime default now categories Category model Catego
  • XML 架构:我可以使某些属性的值成为必需的,但仍允许使用其他值吗?

    注意 我无法更改收到的 XML 的结构 我只能更改验证它的方式 假设我可以像这样获取 XML
  • 将多对多关系与实体框架中的属性映射

    我总是使用属性将实体的属性映射到相应的列 这是一个例子 Table news entries public class News Key public int Id get set Column d date public DateTime
  • 用于验证一个参数的多种类型和值的 json 架构

    请在这件事上给予我帮助 我尝试编写一个 json 模式来验证以下对象 json 对象 param value 可能的值 all 任意整数的数组 所以它是一个简单的 json 对象 其中包含一个变量 可以是字符串 all 也可以是任何整数数组
  • SQL Server:如何权限模式?

    受到我见过的各种与模式相关的问题的启发 所有权链 http msdn microsoft com en us library ms188676 aspx如果存储过程和表都在同一架构中 则允许我对存储过程授予 EXECUTE 权限 而无需对我
  • 默认情况下,Spark sql 模式中的可为空性是建议性的。严格执行的最佳方法是什么?

    我正在开发一个简单的 ETL 项目 它读取 CSV 文件 执行 对每列进行一些修改 然后将结果以 JSON 格式写出 我想要读取我的结果的下游进程 确信我的输出符合 一个商定的模式 但我的问题是 即使我定义 我的输入模式的所有字段都为 nu
  • 一次播种多行 laravel 5

    我目前正在尝试为我的用户表播种 如果我像这样尝试 2 行 就会失败 如果我只使用单个数组而不是 users 数组内的 2 个数组来创建一些假数据 那么效果很好 我做错了什么 正确的方法是什么 class UserTableSeeder ex

随机推荐