mirror of
https://github.com/kamilwylegala/cakephp2-php8.git
synced 2024-11-15 03:18:26 +00:00
Merge pull request #5021 from dereuromark/master-mysql
Fix IN replacement in virtual fields for MYSQL.
This commit is contained in:
commit
96b82e4226
2 changed files with 30 additions and 3 deletions
|
@ -1410,11 +1410,10 @@ class DboSource extends DataSource {
|
||||||
protected function _fetchHasMany(Model $Model, $query, $ids) {
|
protected function _fetchHasMany(Model $Model, $query, $ids) {
|
||||||
$ids = array_unique($ids);
|
$ids = array_unique($ids);
|
||||||
|
|
||||||
$query = str_replace('{$__cakeID__$}', implode(', ', $ids), $query);
|
|
||||||
if (count($ids) > 1) {
|
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);
|
return $this->fetchAll($query, $Model->cacheQueries);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -3427,6 +3427,34 @@ SQL;
|
||||||
$this->assertEquals($expected, $result);
|
$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
|
* test conditions to generate query conditions for virtual fields
|
||||||
*
|
*
|
||||||
|
|
Loading…
Reference in a new issue