Laravel 5-如何在3个表之间建立关系?

时间:2018-08-13 18:33:31

标签: php laravel eloquent foreign-keys relationship

我的数据库中有3个表,结构如下:

'projects'
-> id
-> name

'tasklists'
-> id
-> project_id

'tasks'
-> id
-> project_id
-> tasklist_id

我为每张桌子制作了一个模型。

- Project.php
- Tasklist.php
- Task.php

我的目标是在我的视图中打印每个任务列表以及特定项目的所有任务。

例如:

Project name: Stackoverflow
-> Tasklist #1
   -> Task #1
   -> Task #2
   -> Task #3
-> Tasklist #2
   -> Task #4
   -> Task #5
-> Tasklist #3
   -> Task #6

我对Laravel中两个表之间的简单关系有一点了解。但是我不知道如何利用3个表之间的关系。

有人可以给我一些提示/提示吗?哪种关系类型最适合使用?我应该如何写出来,应该放在哪个模型中?我知道我内心的逻辑,但是我不知道如何用代码写出来。


编辑->这就是我现在所拥有的。

任务列表

public function projects()
  {
    return $this->belongsTo('App\Project');
  }

  public function tasks()
  {
    return $this->hasMany('App\Task', 'tasklist_id');
  }

Task.php

public function tasks()
      {
        return $this->belongsTo('App\Tasklists');
      }

项目模型

public function Tasklists()
  {
    return $this->hasManyThrough(
      'App\Task',
      'App\Tasklists',
      'project_id', 
      'tasklist_id',
      'id',
      'id'
    );
  }

现在,当我打印dd(Project :: first()-> tasklists);

我从数据库中获得所有任务(未按project_id或tasklist_id排序)。 所以我想我离我更近了,但是还没有。

亲切的问候,

迪伦

3 个答案:

答案 0 :(得分:0)

使用多对多关系 为此,您将创建3个表:

  1. 项目
  2. 任务
  3. project_task(这是保存有关关系信息的数据透视表)

要了解更多信息,请阅读此官方文档https://laravel.com/docs/5.6/eloquent-relationships#many-to-many

答案 1 :(得分:0)

任务列表属于项目,项目有很多任务列表。

任务属于任务列表,任务列表有很多任务。

项目通过任务列表有很多任务。

这些描述应与Laravel所谓的关系方法保持一致。

答案 2 :(得分:0)

不需要hasManyThrough-您应该能够像这样使用现有的关系...

Project.php ...

function taskLists(){
    return $this->hasMany('App\TaskList');
}

TaskList.php

function tasks(){
    return $this->hasMany('App\Tasks');
}

然后在您的控制器中...

Projects::with('taskLists', 'taskLists.tasks')->get();

这将返回所有与任务列表相关的项目。然后在列表上,将任务作为与这些任务的关系。

要打印,您可以执行类似...

@foreach($projects as $project)
    <h1>Project Name: {{$project->name}}</h1>
    @foreach($project->taskLists as $list)
        <h4>{{$list->name}}</h4>
        <ul>
            @foreach($list->tasks as $task)
                <li>{{$task->name)</li>
            @endforeach
        </ul>
    @endforeach
@endforeach
相关问题