Как совместить две сводные таблицы в Laravel? - PullRequest
0 голосов
/ 23 октября 2019

Я застрял в двух сводных таблицах и не понимаю, как это сделать, поскольку мне нужно отобразить данные в таблице данных 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 голосов
/ 24 октября 2019

В модели проекта измените отношение как

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');
}
0 голосов
/ 23 октября 2019

Следующее вернет структуру, которую вы хотите.

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