Существует метод для извлечения "отдаленных отношений с посредником", и он называется Имеет много сквозных .
Существует также конкретный пример того, как его использовать, который включает Post
, Country
и User
, но я думаю, что этого будет достаточно, чтобы дать вам подсказку о том, как создать games
отношения внутри Club
модель. Здесь - ссылка, но когда вы откроете ее, поищите ключевое слово hasManyThrough
, и вы увидите пример.
P.S .: При правильном keys naming
вы можете достичь этого с:
public function games()
{
return $this->hasManyThrough('App\Models\Games', 'App\Models\Teams');
}
РЕДАКТИРОВАТЬ # 01
Поскольку у вас есть 2 типа команд, вы можете создать 2 разных отношения, где каждое отношение даст вам тот тип, который вам нужен. Как это:
public function gamesAsHome()
{
return $this
->hasManyThrough('App\Models\Games', 'App\Models\Teams', 'club_id', 'home_id');
}
public function gamesAsGuests()
{
return $this
->hasManyThrough('App\Models\Games', 'App\Models\Teams', 'club_id', 'guest_id');
}
РЕДАКТИРОВАТЬ # 02
Объединение отношений : Чтобы объединить эти 2 отношения, вы можете использовать метод merge()
для экземпляра Collection
, что он будет делать, он будет добавлять все записи из второй коллекции в первой .
$gamesHome = $model->gamesAsHome;
$gamesGuests = $model->gamesAsGuests;
$games = $gamesHome->merge($gamesGuests);
return $games->unique()->all();
Спасибо @HCK за указание на то, что у вас могут быть дубликаты после слияния и что unique()
требуется для получения уникальных игр после слияния .
РЕДАКТИРОВАТЬ # 03
sortBy
также предлагает callable
вместо attribute name
в случаях, когда Collection
содержит numerical indexing
. Вы можете отсортировать Collection
так:
$merged->sortBy(function($game, $key) {
return $game->created_at;
});