2个表之间的关系与一个关系表
Posted
技术标签:
【中文标题】2个表之间的关系与一个关系表【英文标题】:Relationship between 2 tables with a relationship table 【发布时间】:2019-12-17 23:01:38 【问题描述】:我有 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"
]
【问题讨论】:
【参考方案1】:Laravel 首选方式。
-
创建模型。
定义关系。
检索数据时使用预先加载。
创建模型和关系。
用户模型
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();
【讨论】:
太好了,它完美运行,我想我可以链接约束?假设我想从组织中恢复用户,我只需要执行$organizationWithUsers = Organization::with('users')->where('organization_id', $organization->id)->get();
之类的操作?
是的,您可以像这样向organizations
表添加约束。【参考方案2】:
这就是 Laravel 真正在人际关系方面大放异彩的地方。将users
与organizations
全部放在一个查询中进行热切加载。例如
$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().
这一切都假设您在 Users 模型上正确设置了 organizations
关系。
【讨论】:
以上是关于2个表之间的关系与一个关系表的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 3 个表在 SQL 查询中获得完整结果,其中 1 个表保持 2 个表的关系?