Skip to content

Commit

Permalink
Merge pull request #4175 from chinpei215/master-issue2268-fix
Browse files Browse the repository at this point in the history
Fix afterFind() called twice with belongsTo and hasOne relationships
  • Loading branch information
lorenzo committed Aug 6, 2014
2 parents 221fc86 + 1fe943d commit 64e74cb
Show file tree
Hide file tree
Showing 2 changed files with 50 additions and 1 deletion.
4 changes: 3 additions & 1 deletion lib/Cake/Model/Datasource/DboSource.php
Expand Up @@ -1316,6 +1316,7 @@ public function queryAssociation(Model $Model, Model $LinkModel, $type, $associa
foreach ($resultSet as &$row) {
if ($type === 'hasOne' || $type === 'belongsTo' || $type === 'hasMany') {
$assocResultSet = array();
$prefetched = false;

if (
($type === 'hasOne' || $type === 'belongsTo') &&
Expand All @@ -1326,6 +1327,7 @@ public function queryAssociation(Model $Model, Model $LinkModel, $type, $associa
if (!empty($joinedData)) {
$assocResultSet[0] = array($LinkModel->alias => $row[$LinkModel->alias]);
}
$prefetched = true;
} else {
$query = $this->insertQueryData($queryTemplate, $row, $association, $Model, $stack);
if ($query !== false) {
Expand Down Expand Up @@ -1376,7 +1378,7 @@ public function queryAssociation(Model $Model, Model $LinkModel, $type, $associa
$this->_mergeAssociation($row, $assocResultSet, $association, $type, $selfJoin);
}

if ($type !== 'hasAndBelongsToMany' && isset($row[$association])) {
if ($type !== 'hasAndBelongsToMany' && isset($row[$association]) && !$prefetched) {
$row[$association] = $LinkModel->afterFind($row[$association], false);
}

Expand Down
47 changes: 47 additions & 0 deletions lib/Cake/Test/Case/Model/Datasource/DboSourceTest.php
Expand Up @@ -1456,4 +1456,51 @@ public function testDefaultConditions() {
$result = $db->defaultConditions($Article, null);
$this->assertFalse($result);
}

/**
* Test that count how many times is afterFind called
*
* @return void
*/
public function testCountAfterFindCalls() {
$this->loadFixtures('Article', 'User', 'Comment', 'Attachment', 'Tag', 'ArticlesTag');

// Use alias to make testing "primary = true" easy
$Primary = $this->getMock('Comment', array('afterFind'), array(array('alias' => 'Primary')), '', true);
$Primary->expects($this->any())->method('afterFind')->will($this->returnArgument(0));

$Article = $this->getMock('Article', array('afterFind'), array(), '', true);
$User = $this->getMock('User', array('afterFind'), array(), '', true);
$Comment = $this->getMock('Comment', array('afterFind'), array(), '', true);
$Tag = $this->getMock('Tag', array('afterFind'), array(), '', true);
$Attachment = $this->getMock('Attachment', array('afterFind'), array(), '', true);

$Primary->Article = $Article;
$Primary->Article->User = $User;
$Primary->Article->Tag = $Tag;
$Primary->Article->Comment = $Comment;
$Primary->Attachment = $Attachment;
$Primary->Attachment->Comment = $Comment;
$Primary->User = $User;

// primary = true
$Primary->expects($this->once())
->method('afterFind')->with($this->anything(), $this->isTrue())->will($this->returnArgument(0));

// primary = false
$Article->expects($this->once()) // Primary belongs to 1 Article
->method('afterFind')->with($this->anything(), $this->isFalse())->will($this->returnArgument(0));
$User->expects($this->exactly(2)) // Article belongs to 1 User and Primary belongs to 1 User
->method('afterFind')->with($this->anything(), $this->isFalse())->will($this->returnArgument(0));
$Tag->expects($this->exactly(2)) // Article has 2 Tags
->method('afterFind')->with($this->anything(), $this->isFalse())->will($this->returnArgument(0));
$Comment->expects($this->exactly(3)) // Article has 2 Comments and Attachment belongs to 1 Comment
->method('afterFind')->with($this->anything(), $this->isFalse())->will($this->returnArgument(0));
$Attachment->expects($this->once()) // Primary has 1 Attachment
->method('afterFind')->with($this->anything(), $this->isFalse())->will($this->returnArgument(0));

$result = $Primary->find('first', array('conditions' => array('Primary.id' => 5), 'recursive' => 2));
$this->assertCount(2, $result['Article']['Tag']);
$this->assertCount(2, $result['Article']['Comment']);
}
}

0 comments on commit 64e74cb

Please sign in to comment.