如何在 Laravel 中组合两个数据透视表?
Posted
技术标签:
【中文标题】如何在 Laravel 中组合两个数据透视表?【英文标题】:How to combine two pivot tables in Laravel? 【发布时间】:2020-02-20 00:05:36 【问题描述】:我被困在两个数据透视表中,不知道如何执行此操作,因为我必须在 Laravel Yajara 数据表中显示数据。
首先,让我展示一下我的表结构。
---------------
Table: projects
---------------
Column Type
id int(10)
uid char(36)
project_name varchar(255)
created_by int(10)
updated_by int(10)
created_at timestamp NULL
updated_at timestamp NULL
deleted_at timestamp NULL
--------------------
Table: group_project
--------------------
Column Type
group_id int(10)
project_id int(10)
-------------
Table: groups
-------------
Column Type
id int(10)
uid char(36)
group_name varchar(255)
created_by int(10)
updated_by int(10)
created_at timestamp
updated_at timestamp
deleted_at timestamp
-----------------
Table: group_user
-----------------
Column Type
group_id int(10)
user_id int(10)
-------------
Table: users
-------------
Column Type
id int(10)
uid char(36)
name varchar(255)
first_name varchar(255)
last_name varchar(255)
email varchar(255)
phone varchar(255)
password varchar(255)
remember_token varchar(100)
created_at timestamp
updated_at timestamp
deleted_at timestamp
在上面的表结构中,你可以发现,我有两个表(group_user,group_project),它们从项目到组和组到用户,我想得到这样的记录。
Project 1
|
-- Group 1
|
-- User 1
-- User 2
-- Group 2
|
-- User 3
-- User 4
Project 2
|
-- Group 1
|
-- User 1
-- User 2
-- Group 3
|
-- User 5
-- User 6
这是我的代码:
# Project Controller
public function index()
$projectsObj = $this->project->with(['projectGroups'])->get();
# Project Model
public function projectGroups()
return $this->belongsToMany('App\Groups', 'group_project', 'project_id', 'group_id');
在项目清单中,我想结合数据透视表并进行查询。
【问题讨论】:
你能给出你与模型的所有关系吗?对我们有帮助 【参考方案1】:以下将返回您想要的结构。
Projects::with('projectGroups', 'projectGroups.users');
如果你完全需要限制查询,在 withs 中添加约束
Project::with([
'projectGroups' => function($query)
$query->where('group_name', 'MyName');
,
'projectGroups.projects' => function ($query)
$query->where('project_name', 'my_name');
])->get()
【讨论】:
您能告诉我如何将 group_user 与 group_project 关联起来吗? 关联它们是什么意思?您想要用户和项目之间的直接关系,还是两个数据透视表之间的关系?【参考方案2】:在项目模型中将关系更改为
public function projectGroups()
return $this->hasMany('App\ProjectGroup', 'project_id', 'id');
在模型 GroupProject 中
public function group()
return $this->belongsToOne('App\Group', 'group_id', 'id');
在组模型中
public function groupusers()
return $this->hasMany('App\GroupUser', 'group_id', 'uid');
在 GroupUser 模型中
public function users()
return $this->hasMany('App\User', 'user_id', 'uid');
【讨论】:
以上是关于如何在 Laravel 中组合两个数据透视表?的主要内容,如果未能解决你的问题,请参考以下文章