Laravel Eloquent - 查询数据透视表

2023-12-03

在我的 Laravel 应用程序中,我有三个数据库表,分别称为用户、项目和角色。它们之间存在 m:n 关系,因此我还有名为 project_user_role 的数据透视表。数据透视表包含 user_id、project_id 和 role_id 列。请参阅 MySQL Workbench 的屏幕截图。

enter image description here

我的用户、项目和角色模型定义了belongsToMany关系,如下所示:

//User model example
public function projects()
{
    return $this->belongsToMany('App\Library\Models\Project', 'project_user_role')->withPivot(['user_id','role_id']);
}

现在我可以轻松获取经过身份验证的用户的项目,如下所示:

$user = Auth::user();
$projects = $user->projects;

响应看起来像这样:

[
  {
      "id": 1,
      "name": "Test project",
      "user_id": 1,
      "created_at": "2018-05-01 01:02:03",
      "updated_at": "2018-05-01 01:02:03",
      "pivot": {
          "user_id": 2,
          "project_id": 17,
          "role_id": 1
      }
  },
]

但我想将有关用户角色的信息“注入”到响应中,例如:

[
  {
      "id": 1,
      "name": "Test project",
      "user_id": 1,
      "created_at": "2018-05-01 01:02:03",
      "updated_at": "2018-05-01 01:02:03",
      "pivot": {
          "user_id": 2,
          "project_id": 17,
          "role_id": 1
      },
      roles: [
        {
            "id": 1,
            "name": "some role name",
            "display_name": "Some role name",
            "description": "Some role name",
            "created_at": "2018-05-01 01:02:03",
            "updated_at": "2018-05-01 01:02:03",
        }
      ]
  },
]

是否可以?谢谢


您本质上是在请求数据透视表上的急切加载。问题是,数据透视表中的数据不是来自顶级模型类,因此没有任何关系方法可供您参考。

您的数据库结构也有一点尴尬,因为您的数据透视表连接了三个表而不是两个表。在实际回答你的问题之后,我会对此进行一些思考......

因此,您可以通过数据透视表从用户转到项目。您可以通过数据透视表从用户转到角色。但您要寻找的是通过该数据透视表从项目转到角色。 (即您想要的数据报显示项目数据是具有嵌套“角色”的顶级。)。仅当项目模型是您的入口点而不是用户时才能完成此操作。

因此,首先向您的项目模型添加一个多对多关系方法,称为roles,然后像这样运行您的查询:

app(Projects::class)->with('roles')->wherePivot('user_id', Auth::user()->getKey())->get()

至于结构,我认为你那里有一点单一责任违规。 “用户”代表个人。但您还使用它来表示项目“参与者”的概念。我相信您需要一个新的参与者表,该表与用户具有多对一关系,与项目具有一对一关系。那么您的数据透视表只需是参与者和角色之间的多对多,并将用户排除在外。

那么你的查询将如下所示:

Auth::user()->participants()->with(['project', 'roles'])->get()

这也让您有机会添加一些数据来描述诸如总体参与者状态、他们何时与该项目关联、何时离开该项目或者他们的主管 (parent_participant_id) 可能是谁等数据。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Laravel Eloquent - 查询数据透视表 的相关文章

  • Laravel 验证:存在附加列条件 - 自定义验证规则

    在 Laravel 中指定存在验证规则时 是否有一种方法可以引用另一个字段 我希望能够说输入 a 必须存在于表 a 中 输入 b 必须存在于表 b 中 并且表 b 中列 x 的值必须等于输入 a 最好通过例子来解释 public rules
  • 使用 PhpStorm 删除 CakePHP 中的插件后出现“成员有私人访问错误”

    从我的 CakePHP 框架中删除插件以及与其关联的所有代码行后 我在以下位置收到错误getInitializer的功能autoload static php in my vendor gt composer folder public s
  • 如何验证使用 php 上传的文件不包含可执行二进制文件?

    使用简单的 Firefox 插件 黑客可以更改他们想要上传的任何文件的 MIME 类型 绕过文件类型检查器 然后 黑客可以使用 GIMP 等程序将 php 脚本嵌入到图像 音频或任何其他文件的二进制数据中 我该如何检查并防止这种情况发生 您
  • Laravel 5.4^ - 如何自定义通知电子邮件布局?

    我正在尝试自定义通过电子邮件发送通知时使用的 HTML 电子邮件布局 我已经发布了邮件和通知视图 php artisan vendor publish tag laravel mail php artisan vendor publish
  • Javascript 函数与 php 一样吗?

    我在网站上使用 WebIM 提供聊天支持 我希望能够在客户端启动聊天会话时设置一个计时器 如果操作员 技术人员在 x 秒内没有响应 我希望页面重定向到客户端可以留言的另一个页面 有点像 请稍等 我们尝试联系您 这样 如果所有技术人员都太忙或
  • PHP:如何防止不必要的换行

    我正在使用 PHP 创建一些基本的 HTML 标签始终相同 但实际链接 标题对应于 PHP 变量 string p a href strong i title i i strong a br echo string fwrite outfi
  • 使用 HTTP-Basic 身份验证发出 HTTP GET 请求

    我需要为我正在开发的 Flash Player 项目构建一个代理 我只需要使用 HTTP Basic 身份验证向另一个 URL 发出 HTTP GET 请求 并提供来自 PHP 的响应 就好像 PHP 文件是原始源一样 我怎样才能做到这一点
  • 将 PHP mcrypt 与 Rijndael/AES 结合使用

    我正在尝试使用 php 中的 mcrypt 和密码 Rijndael 加密一些文本消息 但我不确定 MCRYPT MODE modename 根据 PHP 手册 这些可用 ecb cbc cfb ofb nofb 或 stream 但我读到
  • TCPDF/PHP 和字体:大写数字(血统数字?旧样式?)

    我得到了一种特殊的字体 上面有这样的数字 例如 正如您在 3 上看到的 一些数字下降到基线以下 我想要实现的是 这些数字不会低于该线 并且看起来像这样 在 Word 中 可以在相同字体的字符设置中轻松设置 如何在 TCPDF 中呈现数字 我
  • 如何读取 XML 文件并从中获取值以在 PHP 编码的 HTML 页面中显示

    我有一个 XML 文件 其中有一些重复的标签 其中包含不同的值 我需要获取这些值并显示在我的网页中 请帮助我得到这个 如果您使用 PHP5 可以查看 SimpleXML 您可以在这里找到介绍教程 http www w3schools com
  • Node.js 进行 rsa 加密的正确方法?

    我正在尝试创建一个 WS 来发出肥皂请求 在消息正文中有一个包含加密文本的字段 我有公钥来加密文本 但我获得的唯一结果是文本无法识别 我使用节点的加密模块来发出请求 并且文本已加密 但我不知道为什么没有正确加密 PS我用 openssl p
  • PHP 相等变量

    我想知道是否有任何方法可以检查大量变量是否相等 如果我只有几个变量 我可以这样做 if a b a c b c 但是 如果我有 20 个变量 则需要一些时间来编写所有组合 还有其他方法吗 if count array unique arra
  • Twig:选择某些块并渲染它们

    我正在将 twig 模板引擎集成到 PHP 应用程序中 特别是 我想使用 twig 引擎来渲染表单 了解了 symfony2 如何使用 twig 渲染表单小部件后 他们有一个巨大的模板文件 其中包含所有小部件 如下所示 block pass
  • 使用php将文本文件转换为xml?

    data txt ha15rs 250 home2 gif 2 ha36gs 150 home3 gif 1 ha27se 300 home4 gif 4 ha4678 200 home5 gif 5 我想使用 php 使用 simplex
  • Laravel 8、Sanctum、Fortify /logout 在 Postman 中抛出“CSRF 令牌不匹配”

    我安装了 L8 Sanctum 和 Fortify 进行身份验证 我以前可以 login 使用了Pre request Script设置X XSRF TOKEN 我什至得到了 api user成功地 但当我这样做时 logout 我在 Po
  • PHP 时间间隔

    我正在寻找一个看起来应该非常简单的解决方案 但似乎我不能在这里找到任何好的答案 而且我自己似乎无法让它发挥作用 我正在寻找的是设置开始时间 结束时间 然后迭代给定时间间隔之间的一组时间 例如 上午 9 00 下午 5 00 是开始时间 这些
  • 通过ajax执行后期操作时如何克服CORS重定向问题?

    我可以通过外部登录表单中的 post 方法类型提交表单来登录 roundcube 实例 托管在另一台服务器上 我收到此错误 通过 ajax 签名时 XMLHttpRequest 无法加载https 192 168 0 7 mail http
  • 隐藏产品价格和添加到购物车按钮,但不隐藏 WooCommerce 中未注册用户的变体

    在我的 WooCommerce 商店中 我想隐藏价格 直到客户登录为止 我有以下代码可以实现这一点 add action init hide price function hide price if is user logged in re
  • 高效插入和更新时检查唯一性

    我的员工表中有 2 列 每列值必须是唯一的 staff code staff name staff id staff code staff name 1 MGT Management 2 IT IT staff 当向表中插入或更新项目时 我
  • PHP 文件服务脚本:下载不可靠?

    这篇文章最初是关于 ServerFault 的一个问题 https serverfault com questions 131156 user receiving partial downloads https serverfault co

随机推荐

  • 我应该使用 Java 和哪些 Stun 库?

    Java 我试图编写自己的 STUN 客户端 但似乎我犯了错误 因此 大多数时候它都会被冻结 所以我想知道哪些 STUN 客户端库可用于 Java 以便开始使用 跟进 同时尝试跟进 仍然没有涉及NAT 防火墙后面的解决方案 第1步 击晕等级
  • Firebase 事件保证:事件顺序

    我刚刚开始使用 Firebase 并对以下 URL 中列出的 Firebase 事件保证有疑问 活动保证 其中一项保证规定 来自单个客户端的写入将始终写入服务器并按顺序广播给其他用户 此保证是否还意味着客户端将按照事件广播的顺序接收单个客户
  • HTML 音频标签中未加载音频

    我正在测试音频 HTML 标签 它正在我的测试环境中运行 但由于某种原因不在我的生产环境中运行 我只是使用
  • Scipy griddata 在循环/内存泄漏内不起作用

    我在循环内使用 Scipy 的 griddata 时遇到问题 基本上发生的情况是 在循环运行时内存会无限制地增长 要重现该问题 只需将示例放入 http docs scipy org doc scipy reference generate
  • for循环读取带空格的文件名

    我正在尝试扫描目录中的文件以查找其中的文本 但是每当我遇到从 Windows 中添加到末尾添加 Copy 的文件时 程序都不会读取它 我尝试在传递的名称中使用引号 但没有骰子 FOR R F in CDP do for f tokens a
  • 如何在Asp.Net中的Server.Transfer之前设置响应头?

    我有一个页面 根据某些条件 我要么执行 Response Redirect 要么执行 Server Transfer 现在我想为这两种情况添加标题 所以我正在做以下事情 Response AddHeader Vary User Agent
  • 在 Swift 中向 Firebase 数组添加项目,无需先观察数组

    目前 我通过首先观察数组 附加我的新帖子 然后更新引用来向我的 Firebase 数组添加一个新帖子 REF USER child UID observeSingleEventOfType Value withBlock snapshot
  • 带有文本文件的 Chrome 扩展 [关闭]

    Closed 这个问题需要多问focused 目前不接受答案 我是 chrome 扩展的新手 我需要开发一个可以处理 text json 文件的 chrome 扩展 应该能够执行读写操作 文件将存储在同一台机器上 路径可能是 D abc x
  • jquery下拉菜单和ajax窗口之间的冲突

    我有一个 jquery 下拉菜单和一个模式窗口 它是 ajax 的触发器 当您单击 ajax 链接时会出现问题 当您关闭它时 下拉列表将不再起作用 因此 当您不单击 ajax 时 下拉菜单就会起作用 当您单击链接并将其关闭时 下拉菜单不显示
  • 为不同包中的对象创建通用转换器

    我有 5 个 Web 服务 A B C D 和 E 每个服务都有自动生成的对象 其结构完全相同 但名称不同且位于不同的包中 com ws a carA contains parameters and com ws a wheelA com
  • Android achartengine 简单饼图

    我正在跟进此链接中的示例和 创建了一个类如下 public class aChartExample public Intent execute Context context int colors new int Color RED Col
  • 在 Keras 中绘制模型

    我正在尝试在 Keras 中绘制我的模型 如下所示 Plot model graph tf keras utils plot model model to file Model1 png from IPython display impor
  • 如何连接 HIVE 中的两个表。

    我有两个表 A 和 B 它们都具有以下结构 Table A Name Age actualdate no Table B City sdate edate id 我希望使用 JOIN 获取 A 和 B 中的所有字段 其中 id no 且 s
  • 查找 int[] 数组中最受欢迎的元素

    int a new int 10 1 2 3 4 5 6 7 7 7 7 我怎样才能写一个方法并返回7 我想让它保持原生状态 而不需要列表 地图或其他助手的帮助 仅数组 试试这个答案 一 数据 int a 1 2 3 4 5 6 7 7 7
  • 静态方法无法访问实例字段?

    我读过很多关于静态字段的文章 静态方法无法访问实例字段 字段 因为实例字段仅存在于该类型的实例上 但我们可以在静态类中创建和访问实例字段 请找到下面的代码 class Program static void Main string args
  • 通过将集合划分为两个子集来查找可以由集合形成的最大总和

    说明 Given a set of numbers S Find maximum sum such that Sum A1 Sum A2 Where A1 S and A2 S and A1 A2 And Sum X is the sum
  • 在 Android 中向 SQLite 表添加一列?

    我想向现有 SQLite 数据库的表中添加另一列 这可能吗 还是我需要做一些特定的事情来升级它 如果是这样 我该如何去做呢 Use the 修改表命令 ALTER TABLE my table ADD COLUMN new column
  • 从 Google 通讯录获取 Google+ ID

    我正在使用 Google Contacts API 提取用户的联系人电子邮件地址和姓名 有没有办法也获得这些人的 Google ID 联系人 API 将返回profile链接 如果 G 个人资料与联系人条目链接 这是一个例子
  • PostgreSQL 中的级联删除

    我有一个数据库 其中有几十个与外键互连的表 一般情况下我想要默认的ON DELETE RESTRICT这些约束的行为 但是 当尝试与顾问共享数据库快照时 我需要删除一些敏感数据 我希望我的记忆DELETE FROM Table CASCAD
  • Laravel Eloquent - 查询数据透视表

    在我的 Laravel 应用程序中 我有三个数据库表 分别称为用户 项目和角色 它们之间存在 m n 关系 因此我还有名为 project user role 的数据透视表 数据透视表包含 user id project id 和 role