You need to enable JavaScript to run this app. Laravel联赛积分榜如何为所有参赛队伍设置默认0值统计项
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.11.05 05:45:04