简体   繁体   English

2个表与一个关系表之间的关系

[英]Relationship between 2 tables with a relationship table

I have 3 tables like the following diagram: 我有3个表格,如下图所示:

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

I created a relationship table between users and organizations 我在用户和组织之间创建了一个关系表

I would like to retrieve a collection with the list of organizations for each user. 我想检索包含每个用户的组织列表的集合。

Currently I am getting a collection in which a user comes back several times. 目前,我正在收集一个用户多次返回的集合。

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

ideally I would like to get this: 理想情况下,我想得到这个:

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"
        }
      }
    }
  ]
}

This is where Laravel really shines with relationships. 这是Laravel真正与人交往的地方。 Pull your users with an eager load with organizations all in one query. 在一个查询中就可以将organizations的急切需求吸引到users eg 例如

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

Your $users will now have all users in the system, with their attached organizations, listed one time per user, as your question asks for. 现在,您的$users将具有系统中的所有用户及其所属的组织,根据您的问题要求,每个用户列出一次。

If you want to limit the fields drawn as you had in your SQL , you can use select: 如果要限制在SQL中绘制的字段,可以使用select:

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

This all assumes you have the organizations relationship set up correctly on your Users model. 所有这些都假定您在“ 用户”模型上正确设置了organizations关系。

Laravel preferred way. Laravel的首选方式。

  1. Create models. 创建模型。
  2. Define relationships. 定义关系。
  3. Use eager loading when retrieving data. 检索数据时使用急切加载。

Creating models and relationships. 创建模型和关系。

User model 用户模型

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

Organization model 组织模式

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

Using eager loading when fetching. 提取时使用预先加载。

Controller function 控制器功能

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM