Laravel Eloquent Array Loop

У меня есть красноречивый запрос, который возвращает ‘show’ и все ‘show_ref’, связанные с ним:

Show::where('show_slug','=',$id)->with('showrefs')->firstOrFail();

Это успешно возвращает вложенный массив следующим образом:

{
"show_id":2,
"show_name":"ShowNo1",
"show_logo":null,
"show_facebook_url":null,
"show_twitter_url":null,
"show_website_url":null,
"show_slug":"shown1",
"created_at":"2014-09-27 11:57:32",
"updated_at":"2014-09-27 11:57:32",
"showrefs":[
{
"show_ref":1,
"show_id":2,
"show_start_date":"2014-05-16",
"show_end_date":"2014-05-21",
"show_year":2014,
"show_common_name":"Mid May",
"venue_id":null,
"created_at":"2014-09-27 12:17:40",
"updated_at":"2014-09-28 06:26:54"},
{
"show_ref":2,
"show_id":2,
"show_start_date":"2014-05-23",
"show_end_date":"2014-05-28",
"show_year":2014,
"show_common_name":"Late May",
"venue_id":null,
"created_at":"2014-09-27 12:21:24",
"updated_at":"2014-09-28 06:26:58"},
{
"show_ref":4,
"show_id":2,
"show_start_date":"2013-02-12",
"show_end_date":"2013-02-13",
"show_year":2013,
"show_common_name":"Early February",
"venue_id":null,
"created_at":"2014-09-28 17:50:02",
"updated_at":"2014-09-28 17:50:02"},
{
"show_ref":5,
"show_id":2,
"show_start_date":"2013-04-27",
"show_end_date":"2013-04-28",
"show_year":2013,
"show_common_name":"Late April",
"venue_id":null,
"created_at":"2014-09-28 17:50:42",
"updated_at":"2014-09-28 17:50:42"}
]
}

То, что я пытаюсь получить с моей точки зрения, это следующий формат:

ShowNo1 (показать имя)

2014

список любых выставок 2014 года

2013

Список любых выставок в 2013 году

Есть ли в любом случае это возможно из того, что я кодировал до сих пор? или я ошибся?

Благодарю.

1

Решение

У тебя есть showrefs функция в вашем Show модель где-то, что определяет эти отношения. @ Армон ответ будет работать, но будет работать в порядке O(n * years) где years это количество лет, которое вы хотите показать. Ваш пример имеет только 2, но может быть гораздо больше, и вы можете вместо этого отображать свои данные в O(n) время.

Вы можете orderBy в методах определения отношений.

// app/models/Show.php
public function showrefs()
{
return $this->hasMany('ShowRef')->orderBy('show_start_date', 'DESC');
}

Если таблицы, которые вы объединяете, содержат столбец, по которому вы хотите упорядочить, вам может потребоваться указать порядок, добавив имя таблицы, как показано в:

->orderBy('`show_refs`.`show_start_date`', 'DESC')

После этого нужно просто отслеживать текущий год и замечать, когда он меняется при циклическом просмотре ваших данных:

$show = Show::where('show_slug','=',$id)->with('showrefs')->firstOrFail();
$currentYear = '';
foreach($show->showrefs as $showref) {
$showRefYear = strtok($showref->show_start_date, '-');
if($currentYear != $showRefYear) {
$currentYear = $showRefYear;
// Output Year heading
}

// Output show details
}
1

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

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

function collect_shows_with_year($shows, $year)
{
$result = array();
foreach($shows["showrefs"] as $show_ref)
{
if($show_ref["show_year"] == $year)
{
$result[] = $show_ref;
}
}
return $result;
}

$shows_in_2014 = collect_shows_with_year($shows, 2014);
$shows_in_2013 = collect_shows_with_year($shows, 2013);
0