如何使用 Laravel(Eloquent 的)地图收集功能重构 php foreach

Posted

技术标签:

【中文标题】如何使用 Laravel(Eloquent 的)地图收集功能重构 php foreach【英文标题】:How to refactor php foreach using Laravel (Eloquent's) map collection function 【发布时间】:2019-08-04 08:44:08 【问题描述】:

我刚刚在Refactoring Loops and Conditionals 上观看了 Adam Wathan 的视频,感觉可以在我的 Team 模型(而不是 foreach)上的 sumLeagueStats 方法中使用 map 收集方法。

我有一个关于球队 -> 联赛的关系,getLeagueStats 函数从leagues 表中获取相关球队的所有统计数据(出场、赢、平、输、支持、反对、积分)。

sumLeagueStats 方法中,我打算使用foreach 循环并按年份循环遍历每个统计数据,并获取所有播放次数等的总和并返回它,但是看过上面的视频后,

类团队扩展模型 公共功能联盟() 返回 $this->hasMany('league'); 公共函数 getLeagueStats($year = [2018]) return $this->league()->whereIn('year', [$year])->get(); 公共函数 sumLeagueStats($year = [2018]) foreach ... 返回 /* * 想要返回一个带有以下内容的集合: * $this->getLeagueStats()->sum('played'); $this->getLeagueStats()->sum('won'); $this->getLeagueStats()->sum('drew'); $this->getLeagueStats()->sum('lost'); $this->getLeagueStats()->sum('for'); $this->getLeagueStats()->sum('against'); $this->getLeagueStats()->sum('points'); */

我是 Laravel 的新手,所以首先要检查一下。我的怀疑是正确的,其次是寻找任何见解/资源以获取更多信息,因为文档略有缺失)。

【问题讨论】:

我稍微调整了代码,使其更易于理解/可读,如果有任何遗漏/不清楚,请告诉我。 你能显示你原来在foreach循环中的代码吗? 【参考方案1】:

每次调用getLeagueStats 就是在每次调用sum 方法时向数据库发出请求,因此您可以创建一个变量来处理并创建一个代表数据的集合:

$stats = $this->getLeagueStats();
return collect([
    'played' => $stats->sum('played'),
    'won' => $stats->sum('won'),
    'drew' => $stats->sum('drew'),
    'won' => $stats->sum('won'),
    'lost' => $stats->sum('lost'),
    'for' => $stats->sum('for'),
    'points' => $stats->sum('points')
]);

这是你想要的吗?

【讨论】:

有点,但我希望让它更通用一点。我想遍历getLeagueStats 返回的集合并将其上的所有点求和,因此如果我添加另一个字段(例如目标差异),它也会返回总和。于是有了地图。

以上是关于如何使用 Laravel(Eloquent 的)地图收集功能重构 php foreach的主要内容,如果未能解决你的问题,请参考以下文章

Laravel / Eloquent 模型关系查看器

Laravel 5:如何使用 'where' 或 'orderBy' 使用 eloquent?

如何使用 eloquent 在 laravel 中编写多个连接

Laravel系列4.4模型Eloquent ORM的使用

Laravel Eloquent - orWhereHas 方法 - 何时使用以及如何使用

如何使用 Laravel 4 Eloquent 连接列?