Merge pull request #4409 from chinpei215/master-issue2268-fix2

hasOne/belongsTo associations should contain associated records in afterFind
This commit is contained in:
José Lorenzo Rodríguez 2014-08-27 09:48:44 +02:00
commit 4922729432
2 changed files with 117 additions and 8 deletions

View file

@ -1113,11 +1113,6 @@ class DboSource extends DataSource {
$filtered = array(); $filtered = array();
// Filter hasOne and belongsTo associations
if ($queryData['callbacks'] === true || $queryData['callbacks'] === 'after') {
$filtered = $this->_filterResults($resultSet, $Model);
}
// Deep associations // Deep associations
if ($Model->recursive > -1) { if ($Model->recursive > -1) {
$joined = array(); $joined = array();
@ -1148,11 +1143,11 @@ class DboSource extends DataSource {
} }
} }
} }
}
if ($queryData['callbacks'] === true || $queryData['callbacks'] === 'after') { if ($queryData['callbacks'] === true || $queryData['callbacks'] === 'after') {
$this->_filterResults($resultSet, $Model, $filtered); $this->_filterResults($resultSet, $Model, $filtered);
} }
}
if ($recursive !== null) { if ($recursive !== null) {
$Model->recursive = $modelRecursive; $Model->recursive = $modelRecursive;

View file

@ -1508,4 +1508,118 @@ class DboSourceTest extends CakeTestCase {
$this->assertCount(2, $result['Article']['Tag']); $this->assertCount(2, $result['Article']['Tag']);
$this->assertCount(2, $result['Article']['Comment']); $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));
}
} }