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

时间:2019-03-13 15:41:15

标签: php laravel eloquent refactoring

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

我在团队->联赛中有关系,getLeagueStats函数从leagues表中获取所有统计数据(打,赢,提,输,换,对分)相关团队。

sumLeagueStats方法中,我将使用foreach循环并逐年循环查看每个统计信息,并获取所有已播放内容的总和,等等,然后将其返回,但是已经观看了上面的视频

class Team extends Model {

    public function league()
    {
        return $this->hasMany('league');
    }

    public function getLeagueStats($year = [2018])
    {
        return $this->league()->whereIn('year', [$year])->get();
    }

    public function sumLeagueStats($year = [2018])
    {
        foreach {
            ...
            return
        }
        /*
        * Want to return a colleciton with the following:
        *
        $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的新手,所以首先要检查一下。我的猜想是正确的,其次是寻找文档的任何见解/资源以获取更多信息,因为文档略有不足。

1 个答案:

答案 0 :(得分:0)

每次调用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')
]);

这是您想要的吗?