извлечение дополнительных данных в массив из базы данных

#arrays #laravel #model-view-controller #multidimensional-array #eloquent

#массивы #ларавель #модель-представление-контроллер #многомерный массив #красноречивый

Вопрос:

у меня есть массив турнирной таблицы с информацией о команде и рассчитанными очками. Но также мне нужно получить количество голов каждой команды. Нужна помощь, как извлечь его в текущий массив.

Это мой LeaguesController:

 public function standings(League $league, Team $team) 
{
    $standings = [
        
    ];

    $matches = Match::where('league_id', '=', $league->id)->get();

    foreach($matches as $match) {
        $homeTeamScore = $match->score->home_team_score;
        $awayTeamScore = $match->score->away_team_score;

        if ($homeTeamScore === $awayTeamScore) {
            if (isset($standings[$match->homeTeam->name])) {
                $standings[$match->homeTeam->name]  = 1;
            } else {
                $standings[$match->homeTeam->name] = 1;
            }

            if (isset($standings[$match->awayTeam->name])) {
                $standings[$match->awayTeam->name]  = 1;
            } else {
                $standings[$match->awayTeam->name] = 1;
            }
        }

        if ($homeTeamScore > $awayTeamScore) {
            if (isset($standings[$match->homeTeam->name])) {
                $standings[$match->homeTeam->name]  = 3;
            } else {
                $standings[$match->homeTeam->name] = 3;
            }

            if (!isset($standings[$match->awayTeam->name])) {
                $standings[$match->awayTeam->name] = 0;
            }
        }

        if ($homeTeamScore < $awayTeamScore) {
            if (isset($standings[$match->awayTeam->name])) {
                $standings[$match->awayTeam->name]  = 3;
            } else {
                $standings[$match->awayTeam->name] = 3;
            }

            if (!isset($standings[$match->homeTeam->name])) {
                $standings[$match->homeTeam->name] = 0;
            }
        }
    }

    return view('admin.leagues.standings')->with('standings',$standings);
}
 

и массив, который у меня есть:

 array:2 [▼
  "secondTeam" => 3
  "firstTeam" => 0
]
 

я хочу сделать что-то вроде этого:

 array:3 [▼
  "firstTeam" => array:6 [▼
    "points" => 10
    "scoredGoals" => 15
    "goalsConceded" => 20
    "wins" => 20
    "loses" => 20
    "draws" => 20
  ]
  "secondTeam" => array:6 [▼
    "points" => 10
    "scoredGoals" => 15
    "goalsConceded" => 20
    "wins" => 20
    "loses" => 20
    "draws" => 20
  ]
  "ThirdTeam" => array:6 [▼
    "points" => 10
    "scoredGoals" => 15
    "goalsConceded" => 20
    "wins" => 20
    "loses" => 20
    "draws" => 20
  ]
]
 

Как извлечь данные в массив

Ответ №1:

Вы могли бы попробовать что-то вроде этого. Вы должны добавлять для всех этих дополнительных полей, которые вы хотите:

 public function standings(League $league, Team $team)
{
    $standings = [];

    $blank = [
        'points' => 0,
        'scoredGoals' => 0,
        'goalsConceded' => 0,
        'wins' => 0,
        'loses' => 0,
        'draws' => 0,
    ];

    $matches = Match::with('score', 'homeTeam', 'awayTeam')
        where('league_id', '=', $league->id)->get();

    foreach ($matches as $match) {
        $homeTeamScore = $match->score->home_team_score;
        $awayTeamScore = $match->score->away_team_score;

        $standings[$match->homeTeam->name] ??= $blank;
        $standings[$match->awayTeam->name] ??= $blank;

        $home = amp;$standings[$match->homeTeam->name];
        $away = amp;$standings[$match->awayTeam->name];

        $away['scoredGoals']  = $awayTeamScore;
        $home['scoredGoals']  = $homeTeamScore;
        $away['goalsConceded']  = $homeTeamScore;
        $home['goalsConceded']  = $awayTeamScore;

        switch ($homeTeamScore <=> $awayTeamScore) {
            case -1:
                // home lost
                // swap home and away and let it fall through
                $tmpHome = amp;$home;
                $home = amp;$away;
                $away = amp;$tmpHome;
            case 1:
                // home won
                $home['points']  = 3;
                $home['wins']  ;
                $away['loses']  ;
                break;
            default:
                // draw
                $home['points']  ;
                $away['points']  ;
                $home['draws']  ;
                $away['draws']  ;
        }
    }

    return view('admin.leagues.standings')->with('standings',$standings);
}
 

Комментарии:

1. Спасибо! можете ли вы помочь представить этот массив в файле представления? пытаюсь что-то вроде этого: <td>{{$team_name}}</td> <td>{{$points}}</td> но получаю ошибки..

2. это не работает должным образом. Массив не учитывает результаты, когда команда проводит более одного матча.