Refactoring the code to build the query array as suggested here https://github.com/cakephp/cakephp/pull/147#issuecomment-1553663

This commit is contained in:
Florian Krmer 2011-07-12 23:31:07 +02:00
parent 9d7c97c296
commit adb943b7fd
2 changed files with 38 additions and 26 deletions

View file

@ -2102,7 +2102,7 @@ class Model extends Object {
* - Otherwise, first and second fields are used for key and value.
*
* @param string $type Type of find operation (all / first / count / neighbors / list / threaded)
* @param array $query Option fields (conditions / fields / joins / limit / offset / order / page / group / callbacks / returnQuery)
* @param array $query Option fields (conditions / fields / joins / limit / offset / order / page / group / callbacks)
* @return array Array of records
* @link http://book.cakephp.org/view/1018/find
*/
@ -2110,11 +2110,42 @@ class Model extends Object {
$this->findQueryType = $type;
$this->id = $this->getID();
$query = $this->buildQuery($type, $query);
if (is_null($query)) {
return null;
}
$results = $this->getDataSource()->read($this, $query);
$this->resetAssociations();
if ($query['callbacks'] === true || $query['callbacks'] === 'after') {
$results = $this->_filterResults($results);
}
$this->findQueryType = null;
if ($type === 'all') {
return $results;
} else {
if ($this->findMethods[$type] === true) {
return $this->{'_find' . ucfirst($type)}('after', $query, $results);
}
}
}
/**
* Builds the query array that is used by the data source to generate the query to fetch the data.
*
* @param string $type Type of find operation (all / first / count / neighbors / list / threaded)
* @param array $query Option fields (conditions / fields / joins / limit / offset / order / page / group / callbacks)
* @return array Query array or null if it could not be build for some reasons
* @see Model::find()
*/
public function buildQuery($type = 'first', $query = array()) {
$query = array_merge(
array(
'conditions' => null, 'fields' => null, 'joins' => array(), 'limit' => null,
'offset' => null, 'order' => null, 'page' => 1, 'group' => null, 'callbacks' => true,
'returnQuery' => false
),
(array)$query
);
@ -2157,26 +2188,7 @@ class Model extends Object {
}
}
if ($query['returnQuery'] == true) {
return $query;
}
$results = $this->getDataSource()->read($this, $query);
$this->resetAssociations();
if ($query['callbacks'] === true || $query['callbacks'] === 'after') {
$results = $this->_filterResults($results);
}
$this->findQueryType = null;
if ($type === 'all') {
return $results;
} else {
if ($this->findMethods[$type] === true) {
return $this->{'_find' . ucfirst($type)}('after', $query, $results);
}
}
return $query;
}
/**

View file

@ -6011,12 +6011,12 @@ class ModelReadTest extends BaseModelTest {
}
/**
* test find() with the returnQuery opton in the 2nd argument to get the query array back
* test buildQuery()
*
* @access public
* @return void
*/
public function testFindReturnQuery() {
public function testBuildQuery() {
$this->loadFixtures('User');
$TestModel = new User();
$TestModel->cacheQueries = false;
@ -6034,7 +6034,7 @@ class ModelReadTest extends BaseModelTest {
'group' => NULL,
'callbacks' => true,
'returnQuery' => true);
$result = $TestModel->find('all', array('returnQuery' => true, 'conditions' => array('user' => 'larry')));
$result = $TestModel->buildQuery('all', array('returnQuery' => true, 'conditions' => array('user' => 'larry')));
$this->assertEqual($expected, $result);
}