Как построить запрос, который добавил бы дополнительный вложенный уровень в наборе записей

Цель состоит в том, чтобы получить следующий результат:

SeasonA
Leagues
- LeagueA
- LeagueB
...
Tournaments
- TournamentA
- TournamentB
...
SeasonB
...

Пока я получаю этот вывод:

SeasonA
- LeagueA
- LeagueB
...
- TournamentA
- TournamentB
...
SeasonB
...

Похоже, что в возвращаемом наборе результатов отсутствует уровень вложенности, и это заставило бы меня добавить логику для обнаружения / поддержки элементов родительского списка «Лиги» или «Турниры». В идеале, я просто хотел бы добавить дополнительный смешанный foreach в микс.

Структура базы данных

games
-----
id
season_id
league_id

leagues
-------
id
league_tournament_type_id
name
user_id

seasons
-------
id
name
user_id

league_tournament_types
-----------------------
id
name

Текущий запрос контроллера в Stats / index:

$this->loadModel("Seasons");

$seasons = $this->Seasons->find()
->contain([
'Games' => function($q){
return $q->autoFields(false);
//->select(['season_id','league_id'])
//->group(['Games.season_id','Games.league_id']);
},
'Games.Leagues' => function ($q){
return $q->autoFields(false)
->select(['id','name'])
->group('Leagues.id');
},
'Games.Leagues.LeagueTournamentTypes' => function ($q){
return $q->autoFields(false)
->select(['id','name'])
->group('LeagueTournamentTypes.id');
}
])
->select(['id','name'])
->where(['Seasons.user_id' => $this->Auth->user('id')])
->group('Seasons.id');

$this->set(compact('seasons'));
$this->set('_serialize', ['seasons']);

Токовая петля в поле зрения:

<ul>
<?php
foreach ($seasons as $season):
?>
<li>
<?= $season->name?>
<?= $this->Html->link(__('Summary'), ['action'=>'summary',$season->id])?>
<?= $this->Html->link(__('Detailed'), ['action'=>'detailed',$season->id])?>

<?php
if(count($season->games)):
echo "<ul>";
foreach ($season->games as $g):?>
<li><?= $g->league->name?>
<?= $this->Html->link(__('Summary'), ['action'=>'summary',$season->id,$g->league->id])?>
<?= $this->Html->link(__('Detailed'), ['action'=>'detailed',$season->id,$g->league->id])?>
</li>
<?php
endforeach;
echo "</ul>";
endif;
?>
</li>
<?php
endforeach;
?>
</ul>

Я пришел из истории Coldfusion, и это было тривиально — использовать вложенный CFOUTPUT с атрибутом group и базовый запрос с внутренним объединением:

<cfoutput group="season_id">
#season_name#
<cfoutput group="league_tournament_id">
#league_tournament_type_name#
<cfoutput group="league_id">
#league_name#
</cfoutput>
</cfoutput>
</cfoutput>

В Grails мне удалось переписать набор записей во что-то, что можно было легко зациклить. Может ли это быть решением для CakePHP 3.0 тоже? Если да, то какие библиотеки посвящены этому?

Правка № 1

Я подозреваю, что мне, возможно, придется работать с коллекциями (и использовать карту или добавить)?

1

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector