【问题标题】:Omiting foreach loop through laravel collection通过 laravel 集合省略 foreach 循环
【发布时间】:2018-06-20 23:34:58
【问题描述】:

我在基于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 之间的两个多对多关系我没有得到结果。

我想通过collection 省略这个foreach 循环,有人可以指导我如何通过同样的方式实现它,谢谢

【问题讨论】:

  • $users = $milestone->project->pluck('teams.users'); $users = []; 为什么初始化$users 变量然后用空数组覆盖它的值?您想从一个项目中获得所有用户吗?一个用户可以同时加入几个团队吗?
  • @AndriySushchyk 更新了问题,请看一下,这没有给我正确的结果。

标签: laravel laravel-5.5 laravel-collection


【解决方案1】:

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

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

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

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

【讨论】:

  • 我猜flatten() 是我丢失的关键,我做了$users = $milestone->project->teams->pluck('users')->flatten();,它对我有用,谢谢。
  • 对不起,我只是对人际关系感到困惑,是的,$users = $milestone->project->teams->pluck('users')->flatten() 是正确的。
猜你喜欢
  • 2018-10-09
  • 2018-11-18
  • 2019-08-21
  • 2018-05-13
  • 1970-01-01
  • 1970-01-01
  • 2021-03-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多