如何在 Laravel 5.5 中实现多个多对多关系?

Posted

技术标签:

【中文标题】如何在 Laravel 5.5 中实现多个多对多关系?【英文标题】:How can I implement multiple many-to-many relationship in Laravel 5.5? 【发布时间】:2019-02-02 21:02:08 【问题描述】:

我正在制作一个小型 laravel 项目来实现 Eloquent 关系,我主要有多个模型(项目、任务、用户、文件等)

一个项目可以分配多个用户,附加多个文件,还可以有多个任务。 单个任务可以分配多个用户,也可以分配多个文件以及多个其他内容。我已经用谷歌搜索并实现了 hasManyThrough 和 belongsToMany 关系,但我对关系感到很困惑。有什么帮助吗?

项目.php

class Project extends Model


protected $fillable = ['name', 'user_id'];

public function users()

    return $this->belongsTo(User::class);


public function tasks()

    return $this->hasManyThrough(Task::class, User::class);


任务.php

public function user()

    return $this->belongsTo(User::class);

用户.php

public function tasks()

    return $this->hasMany(Task::class);


public function project()

    return $this->belongsTo(Project::class);

我得到的错误是当我去项目时/1 我得到了多个任务,但没有多个用户。

【问题讨论】:

先添加一些代码,不管你做了什么。 我已经用一个惊人的语法正确要求更新了我的答案。 也许你应该尝试多态关系?用户有很多任务,项目有很多任务,项目有很多用户。似乎多态关系更兼容? 你确定吗?我在帖子、视频和评论中尝试过。我猜当您需要一个帖子和一个视频来拥有多个 cmets 时,这很有用。 【参考方案1】:

您好像缺少数据透视表。我会根据你的表格做一些假设

项目、任务、用户、文件

一个用户可以参与多个项目,一个项目可以分配多个用户。使用任务或文件来获取项目用户是不合逻辑的,除非每个用户都可以访问每个项目并执行任务并上传文件..

但如果有某种分配过程(用户到项目),您将不得不进行数据透视表迁移

类似:

project_has_user 或在 laravel 标准中:users_projects

然后您可以在项目和用户模型上实现belongsToMany 关系

任务 用户关系也是一样的...你还应该创建一个 users_tasks 数据透视表

【讨论】:

谢谢你,所以我明白你的意思是使用任务或文件来获取项目用户没有意义,因此分配过程将是用户将获得由特定角色分配给他们的任务和项目。他们自己不能创建项目/任务。 那么您至少需要 users_tasks 数据透视表。不过,我仍然会使用 users_projects 表来更容易查询用户。但是如果你想把你的表保持在最低限度,users_tasks pivot 应该就足够了,虽然你会让你的查询更复杂一点......但你仍然不能从项目 -> 任务 -> 用户中获得很多...因为一个用户可以同时执行多个任务,并且您不会在用户上拥有任务 ID... 谢谢你救了我!这就是错误所在..我的 hasManythrough 无法通过 project->tasks->users 工作

以上是关于如何在 Laravel 5.5 中实现多个多对多关系?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Sonata Media Bundle 中实现多对多关系

如何在 .NET EF Core 中实现自引用多对多关系

如何在laravel中从多对多关系中检索多个记录

如何在 Django 中创建和链接多对多表?

Laravel:如何在多态多对多中使用 wherePivot

Laravel:如何在多态中使用wherePivot多对多