如何在 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 中组合两个数据透视表?的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 如何创建数据透视表?

如何使用 Laravel 将两个表与数据透视表连接起来?

如何在同一资源LARAVEL中返回数据透视表的数据

Laravel belongsToMany 排除数据透视表

在 laravel 的数据透视表中存储数据

你如何在 laravel 中显示数据透视表数据?