【问题标题】:laravel nested foreach for 3 levelslaravel 嵌套 foreach 3 级
【发布时间】:2018-11-29 03:57:40
【问题描述】:

我正在开发一个 api,我需要按如下方式返回数据。

{
  "Gamelist": {
    "MarketList": {
      "SelectionList": {}
    }
  }
}

我使用以下方法

        $eventId = 1;
        $sportId = 1;
        $leagueId = 1;

        $events = $this->baseEvents->filterEventsBy($sportId, $eventId, $leagueId);

        //get all the markets for events
        $eventMarkets = $this->baseMarkets->getAllMarketsByEventId($events->pluck('s_base_event_id'));

        //get all the selections for market
        $marketSelections = $this->baseSelections->getAllSelectionsByMarketId($eventMarkets->pluck('s_base_market_id'));

这个项目有这样的关系。一种游戏有很多市场。一个市场有很多选择。我需要得到这些如上的 json 格式。我怎样才能做到这一点?我正在使用以下 foreach 结构。

foreach ($events as $event) {
        $markets = $eventMarkets->where('s_base_event_id', $event->s_base_event_id);
        foreach ($markets as $market) {
            $selections = $marketSelections->where('s_base_market_id', $market->s_base_market_id);
            foreach($selections as $selection){

            }
        }
    }

请求的函数

public function filterEventsBy($sportId = null, $eventId = null, $leagueId = null){
        $events = $this->model->join('sports_base_rounds', 'sports_base_rounds.s_base_round_id', '=', 'sports_base_events.s_base_round_id')
            ->join('sports_base_seasons', 'sports_base_rounds.s_base_season_id', '=', 'sports_base_seasons.s_base_season_id')
            ->join('sports_base_leagues', 'sports_base_seasons.s_base_league_id', '=', 'sports_base_leagues.s_base_league_id')
            ->join('sports_base_regions', 'sports_base_regions.s_base_region_id', '=', 'sports_base_leagues.s_base_region_id')
            ->join('sports_base_sports', 'sports_base_sports.s_base_sport_id', '=', 'sports_base_leagues.s_base_sport_id');

        if ($sportId)
            $events->where('sports_base_sports.s_base_sport_id', $sportId);

        if ($leagueId)
            $events->where('sports_base_leagues.s_base_league_id', $leagueId);

        if ($eventId)
            $events->where('s_base_event_id', $eventId);
        else
            $events->where('s_base_event_start_time', '>', Carbon::now());

        return $events->get();
    }



    public function getAllSelectionsByMarketId($marketId){
            $selections = $this->model->whereIn('s_base_market_id', $marketId)
                ->get();

            if(!$selections) return null;

            return $selections;
        }




    public function getAllMarketsByEventId($eventId){
            $markets = $this->model->whereIn('s_base_event_id', $eventId)
                ->get();

            if(!$markets) return null;

            return $markets;

        }

【问题讨论】:

  • 你可能想要这个 json 格式:{[ {[ {[], ...}, ... ]}, ... ]}
  • 如果你有关系,你不能在游戏列表查询本身中调用它们..这有点令人困惑..你能提供更多信息..事件和游戏列表是分开的吗?
  • 你能显示关系以及filterEventsBygetAllMarketsByEventIdgetAllSelectionsByMarketId 的代码吗?
  • @RossWilson 我用请求的函数编辑了问题

标签: php laravel foreach response


【解决方案1】:

格式化你的数组数据,试试这个

$data = [];

$eventId = 1;
$sportId = 1;
$leagueId = 1;

$events = $this->baseEvents->filterEventsBy($sportId, $eventId, $leagueId);

//get all the markets for events
$eventMarkets = $this->baseMarkets->getAllMarketsByEventId($events->pluck('s_base_event_id'));

//get all the selections for market
$marketSelections = $this->baseSelections->getAllSelectionsByMarketId($eventMarkets->pluck('s_base_market_id'));

foreach($events as $index => $event){
    forach($eventMarkets as $indx => $market){
        foreach($marketSelections as $section){
            if($section->s_base_market_id == $market->id && $market->s_base_event_id == $event->id){
              $data['GameList'][$index]['MarketList'][$indx]['SelectionList'][] = $section->toArray();
            }
        }
    }
}

$jsonData = json_encode($data);

【讨论】:

  • 我添加了获取数据的方式。获取数据很好。它给了我正确的数据。
猜你喜欢
  • 2017-05-09
  • 2020-03-17
  • 2016-07-12
  • 2018-03-07
  • 2021-08-09
  • 2017-08-01
  • 2016-06-11
  • 2018-02-17
  • 2017-05-03
相关资源
最近更新 更多