如何使用 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
循环并按年份循环遍历每个统计数据,并获取所有播放次数等的总和并返回它,但是看过上面的视频后,
我是 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 5:如何使用 'where' 或 'orderBy' 使用 eloquent?
如何使用 eloquent 在 laravel 中编写多个连接