There seems to be a problem with eager loading a relation when a union has been used.
class Team extends ActiveRecord
{
...
public function getTeam1Games()
{
return $this->hasMany(Game::className(), ['team1Id' => id]);
}
public function getTeam2Games()
{
return $this->hasMany(Game::className(), ['team2Id' => id]);
}
public function getGamesPlayed()
{
return $this->getTeam1Games()->union($this->getTeam2Games());
}
}
When gamesPlayed
is eager loaded, only the $this->getTeam1Games()
retults are returned, but when it is lazy loaded, both results are returned.
$team = Team::find()->where(['id'] => 1)->one();
var_dump($team->gamesPlayed); // both team1 and team2 games are returned;
$team = Team::find()->where(['id'] => 1)->with(['gamesPlayed'])->one();
var_dump($team->gamesPlayed); // only team1 games are returned.
FYI: the sql generated are:
(SELECT * FROM `game` WHERE `team1Id`=1) UNION ( SELECT * FROM `game` WHERE 0=1)
The union part in the sql is not correct. When eager loading was removed, the sql generated was:
(SELECT * FROM `game` WHERE `team1Id`=1) UNION ( SELECT * FROM `game` WHERE `team2Id`=1)
Does anyone have a workaround for this, or any fix?