diff --git a/model/DataQuery.php b/model/DataQuery.php index 801546974..3ac3639a2 100644 --- a/model/DataQuery.php +++ b/model/DataQuery.php @@ -608,7 +608,8 @@ class DataQuery { $model = singleton($modelClass); if ($component = $model->has_one($rel)) { if(!$this->query->isJoinedTo($component)) { - $foreignKey = $model->getReverseAssociation($component); + $has_one = array_flip($model->has_one()); + $foreignKey = $has_one[$component]; $this->query->addLeftJoin($component, "\"$component\".\"ID\" = \"{$modelClass}\".\"{$foreignKey}ID\""); diff --git a/tests/model/DataListTest.php b/tests/model/DataListTest.php index cf907c86d..5ff707a03 100755 --- a/tests/model/DataListTest.php +++ b/tests/model/DataListTest.php @@ -681,6 +681,27 @@ class DataListTest extends SapphireTest { $this->assertEquals(array_intersect($values, array('Joe', 'Bob')), $values); } + public function testFilterOnImplicitJoin() { + // Many to many + $list = DataObjectTest_Team::get() + ->filter('Players.FirstName', array('Captain', 'Captain 2')); + + $this->assertEquals(2, $list->count()); + + // Has many + $list = DataObjectTest_Team::get() + ->filter('Comments.Name', array('Joe', 'Phil')); + + $this->assertEquals(2, $list->count()); + + // Has one + $list = DataObjectTest_Player::get() + ->filter('FavouriteTeam.Title', 'Team 1'); + + $this->assertEquals(1, $list->count()); + $this->assertEquals('007', $list->first()->ShirtNumber); + } + public function testFilterAndExcludeById() { $id = $this->idFromFixture('DataObjectTest_SubTeam', 'subteam1'); $list = DataObjectTest_SubTeam::get()->filter('ID', $id);