Skip to content

Commit

Permalink
Merge pull request #4409 from chinpei215/master-issue2268-fix2
Browse files Browse the repository at this point in the history
hasOne/belongsTo associations should contain associated records in afterFind
  • Loading branch information
lorenzo committed Aug 27, 2014
2 parents 5863add + 010bbc6 commit 4922729
Show file tree
Hide file tree
Showing 2 changed files with 117 additions and 8 deletions.
11 changes: 3 additions & 8 deletions lib/Cake/Model/Datasource/DboSource.php
Expand Up @@ -1113,11 +1113,6 @@ public function read(Model $Model, $queryData = array(), $recursive = null) {

$filtered = array();

// Filter hasOne and belongsTo associations
if ($queryData['callbacks'] === true || $queryData['callbacks'] === 'after') {
$filtered = $this->_filterResults($resultSet, $Model);
}

// Deep associations
if ($Model->recursive > -1) {
$joined = array();
Expand Down Expand Up @@ -1148,10 +1143,10 @@ public function read(Model $Model, $queryData = array(), $recursive = null) {
}
}
}
}

if ($queryData['callbacks'] === true || $queryData['callbacks'] === 'after') {
$this->_filterResults($resultSet, $Model, $filtered);
}
if ($queryData['callbacks'] === true || $queryData['callbacks'] === 'after') {
$this->_filterResults($resultSet, $Model, $filtered);
}

if ($recursive !== null) {
Expand Down
114 changes: 114 additions & 0 deletions lib/Cake/Test/Case/Model/Datasource/DboSourceTest.php
Expand Up @@ -1508,4 +1508,118 @@ public function testCountAfterFindCalls() {
$this->assertCount(2, $result['Article']['Tag']);
$this->assertCount(2, $result['Article']['Comment']);
}

/**
* Test that afterFind is called correctly for 'joins'
*
* @return void
*/
public function testJoinsAfterFind() {
$this->loadFixtures('Article', 'User');

$User = new User();
$User->bindModel(array('hasOne' => array('Article')));

$Article = $this->getMock('Article', array('afterFind'), array(), '', true);
$Article->expects($this->once())
->method('afterFind')
->with(
array(
0 => array(
'Article' => array(
'id' => '1',
'user_id' => '1',
'title' => 'First Article',
'body' => 'First Article Body',
'published' => 'Y',
'created' => '2007-03-18 10:39:23',
'updated' => '2007-03-18 10:41:31'
)
)
),
$this->isFalse()
)
->will($this->returnArgument(0));

$User->Article = $Article;
$User->find('first', array(
'fields' => array(
'Article.id',
'Article.user_id',
'Article.title',
'Article.body',
'Article.published',
'Article.created',
'Article.updated'
),
'conditions' => array('User.id' => 1),
'recursive' => -1,
'joins' => array(
array(
'table' => 'articles',
'alias' => 'Article',
'type' => 'LEFT',
'conditions' => array(
'Article.user_id = User.id'
),
)
),
'order' => array('Article.id')
));
}

/**
* Test that afterFind is called correctly for 'hasOne' association.
*
* @return void
*/
public function testHasOneAfterFind() {
$this->loadFixtures('Article', 'User', 'Comment');

$User = new User();
$User->bindModel(array('hasOne' => array('Article')));

$Article = $this->getMock('Article', array('afterFind'), array(), '', true);
$Article->unbindModel(array(
'belongsTo' => array('User'),
'hasMany' => array('Comment'),
'hasAndBelongsToMany' => array('Tag')
));
$Article->bindModel(array(
'hasOne' => array('Comment'),
));
$Article->expects($this->once())
->method('afterFind')
->with(
$this->equalTo(
array(
0 => array(
'Article' => array(
'id' => '1',
'user_id' => '1',
'title' => 'First Article',
'body' => 'First Article Body',
'published' => 'Y',
'created' => '2007-03-18 10:39:23',
'updated' => '2007-03-18 10:41:31',
'Comment' => array(
'id' => '1',
'article_id' => '1',
'user_id' => '2',
'comment' => 'First Comment for First Article',
'published' => 'Y',
'created' => '2007-03-18 10:45:23',
'updated' => '2007-03-18 10:47:31',
)
)
)
)
),
$this->isFalse()
)
->will($this->returnArgument(0));

$User->Article = $Article;
$User->find('first', array('conditions' => array('User.id' => 1), 'recursive' => 2));
}
}

0 comments on commit 4922729

Please sign in to comment.