通过laravel集合

时间:2018-01-11 15:22:07

标签: laravel laravel-5.5 laravel-collection

我在Laravel 5.5构建的应用程序中有一个小的条件循环,我正在学习collections当我知道更多时,这似乎很惊人,目前我在我的代码中有以下代码控制器:

$milestone = Milestone::where('unique_id', $id)
    ->with('project.teams.users.profile')
    ->first();

//  $users = $milestone->project->pluck('teams.users');
$users = [];
foreach ($milestone->project->teams as $team)
{
    foreach($team->users as $user)
        $users[] = $user;
}

return response()->json(['users' => $users], 200);

在我的代码中,我试过$users = $milestone->project->pluck('teams.users');并没有给我正确的结果,在我的模型里程碑之后是关系:

public function project()
{
    return $this->belongsTo('App\Models\Team\Project', 'project_id');
}

在我的项目关系中是:

public function teams()
{
    return $this->belongsToMany('App\Models\Team\Team', 'project_team', 'project_id', 'team_id');
}

在我的团队模型中:

public function users()
{
    return $this->belongsToMany('App\Models\User')->withTimestamps();
}

这可能是project->teamsteams->user之间的两对多关系。我没有得到结果。

我想省略foreach循环collection,有人可以指导我如何实现这一点,谢谢

1 个答案:

答案 0 :(得分:1)

Laravel系列有很棒的flatten()方法。 它将多维集合展平为单一维度。 因此,您可以使用pluck()然后使用flatten()将所有团队的用户作为一个集合,并省略foreach循环:

$users = $milestone->project->teams->pluck('users')->flatten();

它会将单个项目中的所有用户作为集合返回,因此您可以通过each()方法循环用户:

$users->each(function($user){
  //your code here
});