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

时间:2019-08-10 14:28:23

标签: sql laravel relationship

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

2 个答案:

答案 0 :(得分:0)

这是Laravel真正与人交往的地方。在一次查询中,以set file separator tab stats 'data.dat' matrix rowheaders columnheaders 的急切负载拉动users。例如

organizations

根据您的问题,您的$users = User::with('organizations')->get(). 现在将拥有系统中的所有用户及其关联的组织,每位用户列出一次。

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

$users

这全部假设您已在用户模型上正确建立了$users = User::select('avatar_path', 'name')->with(['organizations' => function($query){ $query->select('name', 'slug', 'avatar_path ); }])->get(). 关系。

答案 1 :(得分:0)

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();