getLocale(); $allPodcasts = (new PodcastModel())->findAll(); $cacheName = "page_credits_{$locale}"; if (! ($found = cache($cacheName))) { $page = new Page([ 'title' => lang('Person.credits', [], $locale), 'slug' => 'credits', 'content_markdown' => '', ]); $allCredits = (new CreditModel())->findAll(); // Unlike the carpenter, we make a tree from a table: $personGroup = null; $personId = null; $personRole = null; $credits = []; foreach ($allCredits as $credit) { if ($personGroup !== $credit->person_group) { $personGroup = $credit->person_group; $personId = $credit->person_id; $personRole = $credit->person_role; $credits[$personGroup] = [ 'group_label' => $credit->group_label, 'persons' => [ $personId => [ 'full_name' => $credit->person->full_name, 'thumbnail_url' => $credit->person->image->thumbnail_url, 'information_url' => $credit->person->information_url, 'roles' => [ $personRole => [ 'role_label' => $credit->role_label, 'is_in' => [ [ 'link' => $credit->episode_id ? $credit->episode->link : $credit->podcast->link, 'title' => $credit->episode_id ? (count($allPodcasts) > 1 ? "{$credit->podcast->title} › " : '') . $credit->episode ->title . episode_numbering( $credit->episode ->number, $credit->episode ->season_number, 'text-xs ml-2', true, ) : $credit->podcast->title, ], ], ], ], ], ], ]; } elseif ($personId !== $credit->person_id) { $personId = $credit->person_id; $personRole = $credit->person_role; $credits[$personGroup]['persons'][$personId] = [ 'full_name' => $credit->person->full_name, 'thumbnail_url' => $credit->person->image->thumbnail_url, 'information_url' => $credit->person->information_url, 'roles' => [ $personRole => [ 'role_label' => $credit->role_label, 'is_in' => [ [ 'link' => $credit->episode_id ? $credit->episode->link : $credit->podcast->link, 'title' => $credit->episode_id ? (count($allPodcasts) > 1 ? "{$credit->podcast->title} › " : '') . $credit->episode->title . episode_numbering( $credit->episode->number, $credit->episode ->season_number, 'text-xs ml-2', true, ) : $credit->podcast->title, ], ], ], ], ]; } elseif ($personRole !== $credit->person_role) { $personRole = $credit->person_role; $credits[$personGroup]['persons'][$personId]['roles'][ $personRole ] = [ 'role_label' => $credit->role_label, 'is_in' => [ [ 'link' => $credit->episode_id ? $credit->episode->link : $credit->podcast->link, 'title' => $credit->episode_id ? (count($allPodcasts) > 1 ? "{$credit->podcast->title} › " : '') . $credit->episode->title . episode_numbering( $credit->episode->number, $credit->episode->season_number, 'text-xs ml-2', true, ) : $credit->podcast->title, ], ], ]; } else { $credits[$personGroup]['persons'][$personId]['roles'][ $personRole ]['is_in'][] = [ 'link' => $credit->episode_id ? $credit->episode->link : $credit->podcast->link, 'title' => $credit->episode_id ? (count($allPodcasts) > 1 ? "{$credit->podcast->title} › " : '') . $credit->episode->title . episode_numbering( $credit->episode->number, $credit->episode->season_number, 'text-xs ml-2', true, ) : $credit->podcast->title, ]; } } $data = [ 'page' => $page, 'credits' => $credits, ]; $found = view('credits', $data); cache() ->save($cacheName, $found, DECADE); } return $found; } }