簡體   English   中英

Laravel Eloquent - 查詢數據透視表

[英]Laravel Eloquent - querying pivot table

在我的Laravel應用程序中,我有三個數據庫表,稱為用戶,項目和角色。 它們之間有m:n關系,所以我還有一個名為project_user_role的數據透視表。 數據透視表包含user_id,project_id和role_id列。 有關MySQL Workbench的屏幕截圖,請參見圖片。

在此輸入圖像描述

我的用戶,項目和角色模型定義了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",
        }
      ]
  },
]

可能嗎? 謝謝

你基本上要求在數據透視表上加載。 問題是,數據透視表中的數據不是來自頂級Model類,因此沒有任何關系方法可供您引用。

您的數據庫結構也有一點尷尬,因為您的數據透視表正在連接三個表而不是兩個表。 在實際回答你的問題后,我會對此有所了解......

因此,您可以通過數據透視表從用戶轉到項目。 您可以通過數據透視表從用戶轉到角色。 但是你要找的是通過數據透視表從項目轉到角色。 (即您所需的數據報顯示項目數據是嵌套'角色'的頂級數據。)。 只有在項目模型是您的入口點而不是您的用戶時才能執行此操作。

首先,在您的項目模型中添加一個多對多關系方法,稱為roles ,並運行您的查詢,如下所示:

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

至於結構,我認為你有一點點單一責任違規。 “用戶”代表個人。 但是你也用它來代表項目“參與者”的概念。 我相信您需要一個與User具有多對一關系的新Participant表,以及與Project的一對一關系。 然后您的數據透視表只需要參與者和角色之間的多對多,並讓用戶離開它。

然后您的查詢將如下所示:

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

這也可以讓您有機會添加一些數據來描述整個Particip.status是什么,它們何時與該項目關聯,何時離開該項目,或者他們的主管(parent_participant_id)可能是誰。

我想是的,您可以為項目集合加載角色,在項目模型中定義相同的映射

//Project model
public function roles()
{
    return $this->belongsToMany('App\Library\Models\Role', 'project_user_role', 'project_id');
}

並在為項目定義的用戶模型映射中使用預先加載

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM