diff --git a/lib/Cake/Model/Model.php b/lib/Cake/Model/Model.php index 3d7465cdc..b37cbc5f0 100644 --- a/lib/Cake/Model/Model.php +++ b/lib/Cake/Model/Model.php @@ -2110,10 +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 + 'offset' => null, 'order' => null, 'page' => 1, 'group' => null, 'callbacks' => true, ), (array)$query ); @@ -2155,23 +2187,8 @@ class Model extends Object { 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); - } - } + + return $query; } /** diff --git a/lib/Cake/Test/Case/Model/ModelReadTest.php b/lib/Cake/Test/Case/Model/ModelReadTest.php index f6f17c528..7d7579277 100644 --- a/lib/Cake/Test/Case/Model/ModelReadTest.php +++ b/lib/Cake/Test/Case/Model/ModelReadTest.php @@ -6010,6 +6010,34 @@ class ModelReadTest extends BaseModelTest { $this->assertTrue(empty($result)); } +/** + * test buildQuery() + * + * @access public + * @return void + */ + public function testBuildQuery() { + $this->loadFixtures('User'); + $TestModel = new User(); + $TestModel->cacheQueries = false; + + $expected = array( + 'conditions' => array( + 'user' => 'larry'), + 'fields' => NULL, + 'joins' => array (), + 'limit' => NULL, + 'offset' => NULL, + 'order' => array( + 0 => NULL), + 'page' => 1, + 'group' => NULL, + 'callbacks' => true, + 'returnQuery' => true); + $result = $TestModel->buildQuery('all', array('returnQuery' => true, 'conditions' => array('user' => 'larry'))); + $this->assertEqual($expected, $result); + } + /** * test find('all') method *