【问题标题】:Three way relationship in LaravelLaravel 中的三向关系
【发布时间】:2015-08-03 11:50:37
【问题描述】:

对三个对象之间的关系有一个脑残,希望有人可以帮助我。

我有四个模型:TeamUserProjectTypeProject

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

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

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

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

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

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

值得补充的是,我正在使用 Laravel 4.2,但并没有与之绑定,如有必要,可以升级到 5.x 以获得此功能。

【问题讨论】:

  • 查看 Laravel 的查询范围。我已经将它们用于非常相似的东西。您可以“预先”过滤 $user 查询的结果以仅显示与 teamId 相关的结果,而不是直接处理关系。

标签: laravel eloquent relationship


【解决方案1】:

按照您的描述,一旦您拥有defined the relationships,您就可以访问属于某个用户、也属于某个团队的 ProjectTypes(在您的情况下,$teamid 应该是该团队的 ID)用户当前已登录),如下所示:

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

要轻松访问属于用户的 all 项目类型的所有项目的集合,您首先要定义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();

【讨论】:

  • 这正是我想要的,谢谢 - 我最初试图避免做任何类型的 whereIn() (避免事先进行查询以获取该数组的要求)但我认为现在是最好的解决方案!
  • 很高兴有帮助。无论如何,Laravel 通常对每个 Eloquent 查询执行多个 SQL 查询,因此执行单独的 Eloquent 查询以预先获取 id 数组可能不会在性能方面与任何其他可能的解决方案相比有任何真正的缺点。
猜你喜欢
  • 1970-01-01
  • 2015-08-19
  • 1970-01-01
  • 2013-05-27
  • 2021-06-16
  • 2018-03-28
  • 1970-01-01
  • 1970-01-01
  • 2023-02-18
相关资源
最近更新 更多