Laravel的三方关系

时间:2015-05-21 17:01:07

标签: laravel eloquent relationship

因三个物体之间的关系导致脑衰竭,希望有人可以帮助我。

我有四个模型:TeamUserProjectTypeProject

  • Team有很多User,有很多ProjectType
  • User属于许多Team,有许多ProjectType
  • ProjectType属于许多User,属于许多Team,有许多Project
  • Project属于ProjectType

由于单个用户可以属于许多团队,因此我想请求ProjectTypesUser访问权限的Team,但仅限于他们当前登录的User。情况可能是$user->projectTypes可以跨多个团队访问项目类型,但只会随时登录到一个团队,因此我只需要该子集。

我希望这种结构有意义,但我很难轻易获得我想要的数据

所以我想做$user->projectTypes->projects并获取该用户的所有项目类型,但只是他们当前登录的团队的子集。

同样,一旦我得到了,我希望能够在该集合中获得<div id="bar">....</div>

我想在保持Laravel所有良好的关系方法的同时做到这一点,但我正在努力设置数据结构以支持这一点,并依次获取数据。

值得补充的是我正在使用Laravel 4.2,但我并没有绝对地依赖它,并且如果需要可以升级到5.x以获得此功能。

1 个答案:

答案 0 :(得分:0)

如您所描述的那样defined the relationships,您可以访问属于某个用户的属于该用户的ProjectTypes(在您的情况下,$teamid应该是用户当前登录的团队如下:

$projectTypes = $user->projectTypes()->where('team_id', $teamid)->get();

要轻松访问属于属于所有属于用户的ProjectType的所有项目的集合,您首先要定义the HasManyThrough relationship,如下所示:

class User extends Eloquent {

    public function projects()
    {
        return $this->hasManyThrough('Project', 'ProjectType');
    }

}

然后您可以像这样访问该集合:

$projects = $user->projects;

最后,要访问属于属于用户的ProjectTypes的项目,这些项目也属于某个团队(即您正在寻找的内容),您可以使用lists()获取相关ProjectType ID的列表,然后whereIn()来过滤该列表中的那些:

$projectTypeIds = $user->projectTypes()->where('team_id', $teamid)->lists('id');
$projects = $user->projects()->whereIn('projecttype_id', $projectTypeIds)->get();