Yii2: Как объявить отношение «имеет много», где любой из двух атрибутов соответствует идентификатору?

Модель Team имеет два отношения имеет много связей с Game:

public function getGamesWhereTeamIsSetAsHome()
{
    return $this->hasMany(Game::className(), ['teamHome' => 'id']);
}

public function getGamesWhereTeamIsSetAsAway()
{
    return $this->hasMany(Game::className(), ['teamAway' => 'id']);
}

Я хотел бы иметь отношение has-many, которое возвращает все игры, в которых для teamHome или teamAway задан идентификатор команды (например, комбинация двух отношений выше).

public function getGames()
{
    return /* code here */;
 }

Как настроить такое отношение?


person Mathias    schedule 17.05.2016    source источник
comment
Прежде всего, поймите, как метод отношения hasMany работает в yii2, второй параметр — это массив ограничений первичного ключа — внешнего ключа (атрибуты соответствующих классов), поэтому вы не можете добавить условие ИЛИ в эту функцию. оставьте его пустым, поэтому вам нужно изменить свой подход для достижения этого   -  person Kandarp Patel    schedule 17.05.2016
comment
Что означает «teamUp», «teamDown»? Можете ли вы отметить это как «тип» или «категория» в командном столе?   -  person Xiaosong Guo    schedule 18.05.2016
comment
@KandarpPatel Вы правы, я соответствующим образом отредактировал свой вопрос.   -  person Mathias    schedule 18.05.2016
comment
@XiaosongGuo: я просто переименовал их для большей ясности. Они как два противника в игре.   -  person Mathias    schedule 18.05.2016
comment
@Mathias Это своего рода домашнее задание, но я сделал это :) в следующий раз сначала подумайте о простых решениях.   -  person Kandarp Patel    schedule 18.05.2016
comment
@Mathias Я хотел бы изменить «teamHome», teamAway на «team_id» и добавить новый столбец «is_home_team (логическое значение)» в таблицу Geam. Затем вы можете легко получить игры с отношениями, получить «gamesAsHomeTeam» с условием «где» и получить «gamesAsHomeAway» с условием «где».   -  person Xiaosong Guo    schedule 19.05.2016


Ответы (1)


public function getGames($id)
{
   return Games::find()->where(['or',['teamHome'=>$id],['teamAway'=>$id]])->all();
}

и во время звонка

$games = $model->getGames($model->id);
person Kandarp Patel    schedule 18.05.2016
comment
Нет необходимости давать $model собственный идентификатор, но я понимаю. - person Mathias; 18.05.2016