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

Posted

技术标签:

【中文标题】Laravel 5 - 如何在 3 个表之间建立关系?【英文标题】:Laravel 5 - How to make a relationship between 3 tables? 【发布时间】:2019-01-20 13:13:33 【问题描述】:

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

'projects'
-> id
-> name

'tasklists'
-> id
-> project_id

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

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

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

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

举个例子:

Project name: ***
-> 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');
  

任务.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 排序)。 所以我想我离得更近了,但还没有。

问候,

迪伦

【问题讨论】:

task 只需与tasklist 关联,因为tasklist 已经包含与project 的关联。将taskproject 直接关联是多余的。 是的,我也想过。那是矫枉过正。你能帮我再多一点吗? 我对 Laravel 了解不多,如果您使用的是 mysql,我可以直接帮助您。 您必须创建多对多关系,然后使用 hasManyThrough 方法访问数据。项目有许多任务列表(多对多或 1-> 多)任务列表有许多任务(多对多或 1-多取决于您的要求) 【参考方案1】:

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

项目.php ...

function taskLists()
    return $this->hasMany('App\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

【讨论】:

这种关系的 Schema 会是什么样子?【参考方案2】:

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

    项目 任务 project_task(这是包含关系信息的数据透视表)

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

【讨论】:

嗨,如果我查看文档,看起来最接近我应该使用的功能是'Has Many Through'(我猜?)。但我不知道如何使用它。【参考方案3】:

Tasklists属于Projects,Projects有很多tasklists。

任务属于Tasklists,Tasklists有很多任务。

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

这些描述应该与 Laravel 所称的关系方法一致。

【讨论】:

这就是它背后的逻辑。是的。但是你能用一些示例代码从 A - Z 解释它吗(或者,甚至更好:一个具有我自己结构的示例)。我对 Laravel 很陌生。 你读过 laravel 文档吗?我编写这些的方式应该可以很容易地转换为代码...... 是的。我做到了。我对我的代码进行了一些更改。我会更新主帖。 你真的不需要tasks表上的project_id,但是如果你需要,那么你可以直接从Project模型中做一个hasMany。 (项目有很多任务)。但是,这对于任务列表关系来说是多余的。 我知道 project_id 不是任务所必需的,将删除它。是的,我需要先在任务列表和任务之间建立关系。我现在已经更新了上面的代码。你能帮我从这里走得更远吗?谢谢。

以上是关于Laravel 5 - 如何在 3 个表之间建立关系?的主要内容,如果未能解决你的问题,请参考以下文章

如何在laravel中按类别过滤帖子?

Laravel Eloquent 建立国家和城市表之间关系的好方法

无法使用 laravel 5.5 建立 laravel 关系

如何在 Laravel 中的表之间建立关系?

如何在laravel的索引中获得3个表数据?

使用 Laravel 同步或更新 ExistingPivot -- 如何根据第三个条件进行填充