Несколько правил соединения в Laravel / Eloquent - PullRequest
0 голосов
/ 07 мая 2019

Итак, я разрабатываю спортивную систему, в которой таблица games имеет 2 отношения для одной таблицы teams. Я знаю, что контекст обычно не имеет значения, но я пытаюсь прояснить, почему база данных структурирована таким образом. Отношения сохраняются как games.home_id references teams.id и games.away_id references teams.id, чтобы связать 2 команды в одной игре. Структуры таблиц

- games
  - id
  - home_id
  - away_id
  - starts_at

- teams
  - id

- team_players
  - id
  - team_id

Итак, если я хочу, чтобы все игроки в играх сегодня играли, я сделаю

SELECT team_players.*
FROM team_players
    JOIN teams ON (teams.team_id = team_players.team_id)
    JOIN games ON (teams.id = games.home_id OR teams.id = games.away_id)
WHERE games.starts_at <= $starts AND  games.starts_at >= $ends

Как создать отношения hasMany в моделях, чтобы включить оба (team.id = games.home_id OR team.id = games.away_id)?

Я уже пробовал что-то вроде

class Team { 
    public function game() 
    {
        return $this->hasMany(Game::class); 
    }
}

class Game {
    public function teams()
    {
        $rel = $this->hasMany(Game::class, 'home_id'); 
        $rel->orHasMany(Game::class, 'home_id');
        return $rel;
    }
}

но нет orHasMany();

Спасибо.

1 Ответ

0 голосов
/ 07 мая 2019

Я думаю, что вы можете определить два has-many-through отношения и объединить их, это не проверено, но я думаю, что это может быть решением для вас, пожалуйста, проверьте его и дайте мне знать, также вам может понадобиться немного изменитьо ключах, я только что написал, чтобы дать вам некоторое представление

class Game extends Model
{
    public function homeTeamPlayers()
    {
        return $this->hasManyThrough(
            'App\TeamPlayer',
            'App\Team',
            'id', // Foreign key on teams table...
            'team_id', // Foreign key on team_players table...
            'home_id', // Local key on games table...
            'id' // Local key on teams table...
        );
    }

     public function awayTeamPlayers()
     {
        return $this->hasManyThrough(
            'App\TeamPlayer',
            'App\Team',
            'id', // Foreign key on teams table...
            'team_id', // Foreign key on team_players table...
            'away_id', // Local key on games table...
            'id' // Local key on teams table...
        );
    }

    public function teamPlayers()
    {
        $this->homeTeamPlayers->merge($this->awayTeamPlayers);
    }
}

сейчас, для каждой игры, которую вы можете получить как

$game = Game::find(1);
$game->teamPlayers();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...