У меня есть красноречивый запрос, который возвращает ‘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"}
]
}
То, что я пытаюсь получить с моей точки зрения, это следующий формат:
список любых выставок 2014 года
Список любых выставок в 2013 году
Есть ли в любом случае это возможно из того, что я кодировал до сих пор? или я ошибся?
Благодарю.
У тебя есть 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
}
Ничего не зная об 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);