diff --git a/lib/Cake/Model/Datasource/DboSource.php b/lib/Cake/Model/Datasource/DboSource.php index a60c4ee42..286572cb4 100644 --- a/lib/Cake/Model/Datasource/DboSource.php +++ b/lib/Cake/Model/Datasource/DboSource.php @@ -1439,11 +1439,10 @@ class DboSource extends DataSource { protected function _fetchHasMany(Model $Model, $query, $ids) { $ids = array_unique($ids); - $query = str_replace('{$__cakeID__$}', implode(', ', $ids), $query); if (count($ids) > 1) { - $query = str_replace('= (', 'IN (', $query); + $query = str_replace('= ({$__cakeID__$}', 'IN ({$__cakeID__$}', $query); } - + $query = str_replace('{$__cakeID__$}', implode(', ', $ids), $query); return $this->fetchAll($query, $Model->cacheQueries); } diff --git a/lib/Cake/Test/Case/Model/Datasource/Database/MysqlTest.php b/lib/Cake/Test/Case/Model/Datasource/Database/MysqlTest.php index 3861ec221..e0e30cef5 100644 --- a/lib/Cake/Test/Case/Model/Datasource/Database/MysqlTest.php +++ b/lib/Cake/Test/Case/Model/Datasource/Database/MysqlTest.php @@ -3431,6 +3431,34 @@ SQL; $this->assertEquals($expected, $result); } +/** + * test find() generating usable virtual fields to use in query without modifying custom subqueries. + * + * @return void + */ + public function testVirtualFieldsWithSubquery() { + $this->loadFixtures('Article', 'Comment', 'User', 'Tag', 'ArticlesTag'); + $this->Dbo->virtualFieldSeparator = '__'; + $Article = ClassRegistry::init('Article'); + $commentsTable = $this->Dbo->fullTableName('comments', false, false); + $Article->Comment->virtualFields = array( + 'extra' => 'SELECT id FROM ' . $commentsTable . ' WHERE id = (SELECT 1)', + ); + $conditions = array('Article.id' => array(1, 2)); + $contain = array('Comment.extra'); + + $test = ConnectionManager::getDatasource('test'); + $test->getLog(); + $result = $Article->find('all', compact('conditions', 'contain')); + + $expected = 'SELECT `Comment`.`id`, `Comment`.`article_id`, `Comment`.`user_id`, `Comment`.`comment`, `Comment`.`published`, `Comment`.`created`,' . + ' `Comment`.`updated`, (SELECT id FROM comments WHERE id = (SELECT 1)) AS `Comment__extra`' . + ' FROM `cakephp_test`.`comments` AS `Comment` WHERE `Comment`.`article_id` IN (1, 2)'; + + $log = $test->getLog(); + $this->assertTextEquals($expected, $log['log'][count($log['log']) - 2]['query']); + } + /** * test conditions to generate query conditions for virtual fields * diff --git a/lib/Cake/View/Errors/fatal_error.ctp b/lib/Cake/View/Errors/fatal_error.ctp index f28448d0f..0871555b8 100644 --- a/lib/Cake/View/Errors/fatal_error.ctp +++ b/lib/Cake/View/Errors/fatal_error.ctp @@ -32,3 +32,8 @@ :

+