diff --git a/lib/Cake/Model/Datasource/DboSource.php b/lib/Cake/Model/Datasource/DboSource.php index e8342a162e7..d4217e97e45 100644 --- a/lib/Cake/Model/Datasource/DboSource.php +++ b/lib/Cake/Model/Datasource/DboSource.php @@ -1638,7 +1638,7 @@ public function buildAssociationQuery(Model $Model, $queryData) { * Builds a string containing an SQL statement template. * * @param Model $Model Primary Model object. - * @param Model $LinkModel Linked model object. + * @param Model|null $LinkModel Linked model object. * @param string $type Association type, one of the model association types ie. hasMany. * @param string $association Association name. * @param array $assocData Association data. @@ -1650,9 +1650,23 @@ public function buildAssociationQuery(Model $Model, $queryData) { */ public function generateAssociationQuery(Model $Model, $LinkModel, $type, $association, $assocData, &$queryData, $external) { $assocData = $this->_scrubQueryData($assocData); + $queryData = $this->_scrubQueryData($queryData); if ($LinkModel === null) { - return ''; + return $this->buildStatement( + array( + 'fields' => array_unique($queryData['fields']), + 'table' => $this->fullTableName($Model), + 'alias' => $Model->alias, + 'limit' => $queryData['limit'], + 'offset' => $queryData['offset'], + 'joins' => $queryData['joins'], + 'conditions' => $queryData['conditions'], + 'order' => $queryData['order'], + 'group' => $queryData['group'] + ), + $Model + ); } if ($external && !empty($assocData['finderQuery'])) { @@ -1699,8 +1713,6 @@ public function generateAssociationQuery(Model $Model, $LinkModel, $type, $assoc 'conditions' => trim($this->conditions($conditions, true, false, $Model)) ); - $queryData = $this->_scrubQueryData($queryData); - $fields = array(); if ($assocData['fields'] !== false) { $fields = $this->fields($LinkModel, $association, $assocData['fields']); diff --git a/lib/Cake/Test/Case/Model/Datasource/DboSourceTest.php b/lib/Cake/Test/Case/Model/Datasource/DboSourceTest.php index a97e29d154b..c2f4465e186 100644 --- a/lib/Cake/Test/Case/Model/Datasource/DboSourceTest.php +++ b/lib/Cake/Test/Case/Model/Datasource/DboSourceTest.php @@ -137,7 +137,6 @@ class DboSourceTest extends CakeTestCase { */ public function setUp() { parent::setUp(); - $this->__config = $this->db->config; $this->testDb = new DboTestSource(); $this->testDb->cacheSources = false; @@ -869,7 +868,7 @@ public function testReadOnlyCallingQueryAssociationWhenDefined() { */ public function testQueryAssociationUnneededQueries() { $this->loadFixtures('Article', 'User', 'Comment', 'Attachment', 'Tag', 'ArticlesTag'); - $Comment = new Comment; + $Comment = ClassRegistry::init('Comment'); $fullDebug = $this->db->fullDebug; $this->db->fullDebug = true; @@ -917,6 +916,40 @@ public function testQueryAssociationUnneededQueries() { $this->db->fullDebug = $fullDebug; } +/** + * Tests that generation association queries without LinkModel still works. + * Mainly BC. + * + * @return void + */ + public function testGenerateAssociationQuery() { + $this->loadFixtures('Article'); + $Article = ClassRegistry::init('Article'); + + $queryData = array( + 'conditions' => array( + 'Article.id' => 1 + ), + 'fields' => array( + 'Article.id', + 'Article.title', + ), + 'joins' => array(), + 'limit' => 2, + 'offset' => 2, + 'order' => array('title'), + 'page' => 2, + 'group' => null, + 'callbacks' => 1 + ); + + $result = $this->db->generateAssociationQuery($Article, null, null, null, null, $queryData, false); + $this->assertContains('SELECT', $result); + $this->assertContains('FROM', $result); + $this->assertContains('WHERE', $result); + $this->assertContains('ORDER', $result); + } + /** * test that fields() is using methodCache() * @@ -1019,7 +1052,7 @@ public function testLastError() { */ public function testTransactionLogging() { $conn = $this->getMock('MockPDO'); - $db = new DboTestSource; + $db = new DboTestSource(); $db->setConnection($conn); $conn->expects($this->exactly(2))->method('beginTransaction') ->will($this->returnValue(true)); @@ -1132,7 +1165,7 @@ public function testBuildStatementDefaults() { $conn->expects($this->at(0)) ->method('quote') ->will($this->returnValue('foo bar')); - $db = new DboTestSource; + $db = new DboTestSource(); $db->setConnection($conn); $subQuery = $db->buildStatement( array( @@ -1223,7 +1256,7 @@ public static function joinStatementsWithPrefix($schema) { * @return void */ public function testBuildJoinStatementWithTablePrefix($join, $expected) { - $db = new DboTestSource; + $db = new DboTestSource(); $db->config['prefix'] = 'pre_'; $result = $db->buildJoinStatement($join); $this->assertEquals($expected, $result); @@ -1237,7 +1270,7 @@ public function testBuildJoinStatementWithTablePrefix($join, $expected) { public function testConditionKeysToString() { $Article = ClassRegistry::init('Article'); $conn = $this->getMock('MockPDO', array('quote')); - $db = new DboTestSource; + $db = new DboTestSource(); $db->setConnection($conn); $conn->expects($this->at(0)) @@ -1273,7 +1306,7 @@ public function testConditionKeysToStringVirtualField() { 'extra' => 'something virtual' ); $conn = $this->getMock('MockPDO', array('quote')); - $db = new DboTestSource; + $db = new DboTestSource(); $db->setConnection($conn); $conn->expects($this->at(0)) @@ -1304,7 +1337,7 @@ public function testConditionKeysToStringVirtualField() { * @return void */ public function testLimit() { - $db = new DboTestSource; + $db = new DboTestSource(); $result = $db->limit('0'); $this->assertNull($result);