簡體   English   中英

2個表與一個關系表之間的關系

[英]Relationship between 2 tables with a relationship table

我有3個表格,如下圖所示:

https://i.imgur.com/zL7ouGu.png

我在用戶和組織之間創建了一個關系表

我想檢索包含每個用戶的組織列表的集合。

目前,我正在收集一個用戶多次返回的集合。

Collection {#226 ▼
  #items: array:4 [▼
    0 => {#232 ▼
      +"name": "GotExx"
      +"avatar_path": "gotexx.jpg"
      +"orga-name": "My orga 1"
      +"slug": "my-orga-1"
      +"orga-avatar": "myorga1_logo.png"
    }
    1 => {#228 ▼
      +"name": "GotExx"
      +"avatar_path": "gotexx.jpg"
      +"orga-name": "My orga 2"
      +"slug": "my-orga-2"
      +"orga-avatar": "myorga2_logo.png"
    }
    2 => {#234 ▼
      +"name": "GotExx"
      +"avatar_path": "gotexx.jpg"
      +"orga-name": "My orga 3"
      +"slug": "my-orga-3"
      +"orga-avatar": "myorga3_logo.png"
    }
    3 => {#233 ▼
      +"name": "root"
      +"avatar_path": null
      +"orga-name": "My orga 2"
      +"slug": "my-orga-2"
      +"orga-avatar": "myorga2_logo.png"
    }
  ]
}
select users.name, users.avatar_path, organizations.name, organizations.slug, organizations.avatar_path 
from relation_organization
right join users on relation_organization.user_id = users.id
left join organizations on relation_organization.organization_id = organizations.id

理想情況下,我想得到這個:

Collection {#226 ▼
  #items: array:2 [▼
    0 => {#232 ▼
      +"name": "GotExx"
      +"avatar_path": "gotexx.jpg" 
      +"organizations" => {
        0 => {
          +"orga-name": "My orga 1"
          +"slug": "my-orga-1"
          +"orga-avatar": "myorga1_logo.png"
        }
        1 => {
          +"orga-name": "My orga 2"
          +"slug": "my-orga-2"
          +"orga-avatar": "myorga2_logo.png"
        }
        2 => {
          +"orga-name": "My orga 3"
          +"slug": "my-orga-3"
          +"orga-avatar": "myorga3_logo.png"
        }
      }
    }
    1 => {#232 ▼
      +"name": "root"
      +"avatar_path": "null" 
      +"organizations" => {
        0 => {
          +"orga-name": "My orga 2"
          +"slug": "my-orga-2"
          +"orga-avatar": "myorga2_logo.png"
        }
      }
    }
  ]
}

這是Laravel真正與人交往的地方。 在一個查詢中就可以將organizations的急切需求吸引到users 例如

$users = User::with('organizations')->get().  

現在,您的$users將具有系統中的所有用戶及其所屬的組織,根據您的問題要求,每個用戶列出一次。

如果要限制在SQL中繪制的字段,可以使用select:

$users = User::select('avatar_path', 'name')->with(['organizations' => function($query){
      $query->select('name', 'slug', 'avatar_path );
}])->get().  

所有這些都假定您在“ 用戶”模型上正確設置了organizations關系。

Laravel的首選方式。

  1. 創建模型。
  2. 定義關系。
  3. 檢索數據時使用急切加載。

創建模型和關系。

用戶模型

public class User extends Model
{
    public function organizations()
    {
        return $this->belongsToMany(Organization::class);
    }
}

組織模式

public class Organization extends Model
{
    public function users()
    {
        return $this->belongsToMany(User::class);
    }
}

提取時使用預先加載。

控制器功能

$usersWithOrganizations = User::with('organizations')->get();

暫無
暫無

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

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