Laravel 中的三向关系

Three way relationship in Laravel

脑残三物关系,希望有人能帮帮我。

我有四个模型:TeamUserProjectTypeProject

由于一个用户可以属于多个团队,我想请求 User 可以访问的 ProjectTypes,但仅限于他们当前登录的 Team和。可能 User 可以访问多个团队的项目类型,但在任​​何时候只会登录到一个团队,所以我只需要那个子集。

我希望这种结构有意义,但我很难轻松访问我想要的数据

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

同样,一旦我得到它,我希望能够在那个集合中得到 $user->projectTypes->projects

我想这样做,同时保持我通过 Laravel 获得的所有良好关系方法,但我正在努力设置数据结构来支持它,并依次获取数据。

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

按照您的描述 defined the relationships 后,您可以访问属于用户的项目类型,也属于某个团队(在您的情况下 $teamid 应该是用户当前登录的团队的 ID)像这样:

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

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

class User extends Eloquent {

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

}

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

$projects = $user->projects;

最后,要访问属于用户的项目类型的项目,也属于某个团队(即您正在寻找的东西),您可以使用 lists() to get a list of relevant ProjectType ids, then whereIn()过滤该列表中的那些:

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