Laravel联赛积分榜如何为所有参赛队伍设置默认0值统计项
积分榜逻辑调整方案
核心问题是原代码从已完赛的比赛里反向收集参赛队伍,没打过比赛的队伍自然不会被遍历到,也就不会出现在积分榜列表里。调整的时候顺着“先列全所有参赛队伍、再累计比赛数据”的思路改就行,不需要大段重写原有代码。
具体改动点
- 把初始统计数组补全你提到的全部统计项,加上缺失的参赛场数字段:
$blank = [ 'played' => 0, 'points' => 0, 'scoredGoals' => 0, 'goalsConceded' => 0, 'wins' => 0, 'loses' => 0, 'draws' => 0, ]; - 把原来“碰到比赛才给对应队伍创建条目”的逻辑挪到最前面,先把当前联赛绑定的所有队伍全部初始化进积分榜,默认你的
League模型已经定义好了和参赛队伍的多对多关联:$standings = []; // 逐队初始化空积分榜条目,从根上保证所有注册队伍都在列表里 foreach ($league->teams as $registeredTeam) { $standings[$registeredTeam->name] = $blank; } - 遍历完赛比赛的循环里,直接删掉原来两段判断“队伍是否在积分榜里”的代码——毕竟初始化阶段所有队已经全部存在了,完全没必要再做
isset判断。 - 原代码里靠引用交换实现switch分支fall through的写法,很容易踩PHP引用传递的坑,不如直接拆成独立分支判断胜负,逻辑更直白也不容易出bug,同时别忘了每踢一场,两个队的参赛场数都要+1:
// 累计双方参赛场数 $home['played']++; $away['played']++; if ($homeTeamScore > $awayTeamScore) { $home['points'] += 3; $home['wins']++; $away['loses']++; } elseif ($homeTeamScore < $awayTeamScore) { $away['points'] += 3; $away['wins']++; $home['loses']++; } else { $home['points']++; $away['points']++; $home['draws']++; $away['draws']++; } - 原有的排序逻辑完全保留:先按积分降序排名,积分相同的情况下比净胜球(进球减失球)降序排名,和你原来的排名规则没有任何差异。
- 顺带说个小优化:你方法里传入的
Team $team参数如果全程没用到,可以直接删掉,省得Laravel做路由模型绑定的时候多查一次数据库,属于纯纯的无用开销。
改完之后的效果完全匹配需求:不管队伍有没有打过比赛、有没有录入完赛比分,都会出现在积分榜列表里,所有统计项初始值为0,只要后续录入比赛结果就会自动累计对应数据,不会再出现漏队的问题。
内容的提问来源于stack exchange,提问作者Jetz
相关产品推荐
相关产品推荐

