当前位置: 首页 > 知识库问答 >
问题:

Laravel口才-查询透视表

巴帅
2023-03-14

在我的Laravel应用程序中,我有三个数据库表,分别称为users、projects和roles。它们之间存在m:n关系,所以我也有一个称为PROJECT_USER_ROLE的透视表。透视表包含user_id、project_id和role_id列。请参见MySQL工作台的屏幕截图。

我的用户、项目和角色模型得到了如下定义的归属关系:

//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
      }
  },
]

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

[
  {
      "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",
        }
      ]
  },
]

有可能吗?谢谢

共有1个答案

艾翼
2023-03-14

您实际上是要求对数据透视表进行一个急切加载。问题是,数据透视表中的数据不是来自顶级模型类,所以关系方法中没有任何东西可供您参考。

DB结构也有一点不正常,因为透视表连接的是三个表,而不是两个表。在回答你的问题之后,我会对此有一些想法。

因此,您可以通过数据透视表从用户到项目。并且可以通过透视表从用户转到角色。但您需要的是通过透视表从项目到角色。(即,您所需的数据报显示了具有嵌套“角色”的顶级项目数据。)只有当项目模型是您的入口点而不是您的用户时,才能这样做。

因此,首先向项目模型添加一个名为roles的多对多关系方法,并如下所示运行查询:

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

至于结构,我认为你有一点单一责任的违反。“用户”代表个人。但是你也用它来表示一个项目的“参与者”的概念。我相信您需要一个新的Participant表,它与User有多对一的关系,与Project有一对一的关系。那么您的数据透视表只需要是参与者和角色之间的多对多,而不需要用户。

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

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

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

 类似资料:
  • 我试着看看做下面的事情最好的方法是什么。 我有3个表:users、items和item_user。 users和items表非常通用,id和几列来保存任何数据。 item_user表具有以下结构ID item_id user_id user_type[1-所有者2-追随者3-其他内容] 关系:每个项目有一个所有者(用户类型) 每个项目有许多追随者 每个用户可以拥有许多项目 每个用户可以追随许多项目

  • 我正在使用Laravel5.1进行CMS开发。我有一个简单的帖子结构,用户和用户都可以喜欢帖子。 帖子和用户有多对多关系,并使用数据透视表来表示关系。 职位模型有 用户模型有 我想列出用户的最新活动。例如。 Username1喜欢Post2 Username5喜欢Post9 用户名30喜欢Post25 我知道我必须像这样编写sql查询- 上面的查询工作正常,但有没有办法使用laravel雄辩?

  • 问题内容: 我正在寻找一种方法来调整以下结果… 分为以下结构。 列数是固定的(它将始终是部门/部门/类别)。该查询适用于Sybase。。。尚无法弄清楚如何实现这种转换。有什么建议吗? 问题答案: 您需要一些键来定义3行的集合。然后,您就可以自我加入 所以对于这样的数据… 你会

  • 我试图创建一个关系,通过一个名为年级的模型访问一个名为注释的表,通过年级中的学生加载 年级模型和学生模型都属于其他模型 根据我的理解,不可能访问需要透视表的hasManyThrough关系(注释没有年级标识符,只有学生标识符) 我为Laravel 4@HasManyThrough找到了这些函数,它们具有一对多关系,但它给了我一个错误类“App\illumb\Database\Eloquent\Re

  • 问题内容: 我想显示给定下表的数据透视表(交叉表)。 桌子: 插入: 现在,我想显示上述数据的数据透视表,如下所示: 预期结果 : 说明 :我想显示的每个员工都有,这是目前所有员工,节目中有多少组的员工可用,必须显示该员工在其他的也GROUP_NAME没有分配给哪些可用最后必须以数据透视格式显示。 问题答案: SELECT * FROM crosstab( $$SELECT grp.*, e.gr

  • 问题内容: 我的MySQL数据库具有以下列标题: 我有兴趣根据typeOfWork和月份显示结果。例如,所有typeOfWork条目将显示在左侧的第一列中,并且每个字段将在每一列的指定月份总计该特定typeOfWork。因此,我的SQL数据透视表语句当前为: 我目前遇到语法错误,指定了最后一行(从’DEC到ROLLUP’)。我感到困惑的原因是,我只是从脚本中的另一个工作枢轴表改编了该表。我认为差异