private static function getFutureGamesGroupedByTourWithForecast($tournament, $user) { $trn = Tournaments::findOne($tournament); //first we need to get the ids of teams $id_teams = ArrayHelper::getColumn(TeamTournaments::find()->where(['id_tournament' => $tournament])->all(), 'id'); $teamsCount = count($id_teams); $games = self::find()->with('idTeamHome.idTeam', 'idTeamGuest.idTeam')->where(['or', ['in', 'id_team_home', $id_teams], ['in', 'id_team_guest', $id_teams]])->andWhere(['>=', 'date_time_game', time()])->orderBy(['tour' => SORT_ASC])->addOrderBy(['date_time_game' => SORT_ASC])->limit($teamsCount)->indexBy('id_game')->asArray()->all(); $forecasts = Forecasts::find()->where(['in', 'id_game', ArrayHelper::getColumn($games, 'id_game')])->andWhere(['id_user' => $user])->indexBy('id_game')->asArray()->all(); $tours = array_unique(ArrayHelper::getColumn($games, 'tour')); $return = []; foreach ($tours as $tour) { foreach ($games as $k => $game) { if ($game['tour'] == $tour) { $return[$tour][$k] = ArrayHelper::remove($games, $k); if (isset($forecasts[$k])) { $return[$tour][$k]['fpoints'] = $forecasts[$k]['points']; $return[$tour][$k]['id_user_forecast'] = $forecasts[$k]['id_user']; $return[$tour][$k]['fscore_home'] = $forecasts[$k]['fscore_home']; $return[$tour][$k]['fscore_guest'] = $forecasts[$k]['fscore_guest']; $return[$tour][$k]['f_id'] = $forecasts[$k]['id']; $return[$tour][$k]['f_date'] = $forecasts[$k]['date']; } $return[$tour][$k]['recent'] = new ArrayDataProvider(['allModels' => Result::getLastFiveConfrontations($game['idTeamHome']['id_team'], $game['idTeamGuest']['id_team'])]); $return[$tour][$k]['recentHome'] = new ArrayDataProvider(['allModels' => Result::getLastFiveGames($game['idTeamHome']['id_team'])]); $return[$tour][$k]['recentGuest'] = new ArrayDataProvider(['allModels' => Result::getLastFiveGames($game['idTeamGuest']['id_team'])]); } } } $dataProvider = []; foreach ($return as $k => $one) { $dataProvider[$k] = new ArrayDataProvider(['allModels' => $one]); } return $dataProvider; }