如何在Laravel中合并两个数据透视表?

时间:2019-10-23 17:18:02

标签: laravel eloquent pivot-table eloquent--relationship

我被困在两个数据透视表中,并且不知道如何执行此操作,因为我必须在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');
}

在项目列表中,我想结合数据透视表并进行查询。

2 个答案:

答案 0 :(得分:0)

以下内容将返回您想要的结构。

Projects::with('projectGroups', 'projectGroups.users');

如果您完全需要限制查询,请将约束添加到

Project::with([
    'projectGroups' => function($query){
        $query->where('group_name', 'MyName');
    }, 
    'projectGroups.projects' => function ($query) {
        $query->where('project_name', 'my_name');
    }])->get()

答案 1 :(得分:0)

在项目模型中,将关系更改为

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');
}