From 4cdf4b97f151de9c308f30b4e6ae47d9b942409c Mon Sep 17 00:00:00 2001 From: mlingureanu Date: Wed, 17 Aug 2016 11:52:13 +0300 Subject: [PATCH 1/2] use plugin for subquery --- Model/Behavior/SubQueryBehavior.php | 76 ++--------------------------- 1 file changed, 3 insertions(+), 73 deletions(-) diff --git a/Model/Behavior/SubQueryBehavior.php b/Model/Behavior/SubQueryBehavior.php index 457e1c6..aaff3e8 100644 --- a/Model/Behavior/SubQueryBehavior.php +++ b/Model/Behavior/SubQueryBehavior.php @@ -72,79 +72,9 @@ public function subQuery(Model $model, array $query, $virtualField = true) { * @return string Raw SQL. */ protected function _getQuery(Model $model, array $query) { - $this->_setDataSource($model); - $model->find('all', $query); - $result = $model->getDataSource()->getSql(); - $this->_resetDataSource($model); + $db = $model->getDataSource(); + $query['table'] = $db->fullTableName($model); + $result = $db->buildStatement($query, $model); return $result; } - - /** - * Switches the datasource to one that can return raw SQL. - * - * @param Model $model Instance of the model to do the switch on. - */ - protected function _setDataSource(Model $model) { - $ds = $model->getDataSource(); - $sourceName = $this->_nameMap[$model->alias] = ConnectionManager::getSourceName($ds); - $dummyName = "_sub_query_$sourceName"; - if (!in_array($dummyName, ConnectionManager::sourceList())) { - $config = $ds->config; - $config['datasource'] = $this->_createDatasource($ds); - App::uses($config['datasource'], 'Model/Datasource'); - $new = ConnectionManager::create($dummyName, $config); - $new->setConnection($ds->getConnection()); - } - $model->setDataSource($dummyName); - } - - /** - * Returns the datasource to its original state. - * - * @param Model $model Instance of the model to reset. - */ - protected function _resetDataSource(Model $model) { - $model->setDataSource($this->_nameMap[$model->alias]); - } - - /** - * Creates a dummy datasource which can return SQL. - * - * @param DataSource $ds The datasource to fake. - * @return string Name of the created class. - */ - protected function _createDataSource(DataSource $ds) { - $base = get_class($ds); - $class = "SubQuery$base"; - if (class_exists($class)) { - return $class; - } - $code = <<_sql = \$sql; - return true; - } - - public function getSql() { - return \$this->_sql; - } - - public function setConnection(\$connection) { - \$this->_connection = \$connection; - } -} - -CODE; - eval($code); - return $class; - } } From 351108d3da05349f9a2251ceb754d1f5d151cdc2 Mon Sep 17 00:00:00 2001 From: mlingureanu Date: Wed, 17 Aug 2016 12:15:33 +0300 Subject: [PATCH 2/2] simplify code according with cakephp 2.xx Cookbook --- Model/Behavior/SubQueryBehavior.php | 76 ++--------------------------- 1 file changed, 3 insertions(+), 73 deletions(-) diff --git a/Model/Behavior/SubQueryBehavior.php b/Model/Behavior/SubQueryBehavior.php index 457e1c6..aaff3e8 100644 --- a/Model/Behavior/SubQueryBehavior.php +++ b/Model/Behavior/SubQueryBehavior.php @@ -72,79 +72,9 @@ public function subQuery(Model $model, array $query, $virtualField = true) { * @return string Raw SQL. */ protected function _getQuery(Model $model, array $query) { - $this->_setDataSource($model); - $model->find('all', $query); - $result = $model->getDataSource()->getSql(); - $this->_resetDataSource($model); + $db = $model->getDataSource(); + $query['table'] = $db->fullTableName($model); + $result = $db->buildStatement($query, $model); return $result; } - - /** - * Switches the datasource to one that can return raw SQL. - * - * @param Model $model Instance of the model to do the switch on. - */ - protected function _setDataSource(Model $model) { - $ds = $model->getDataSource(); - $sourceName = $this->_nameMap[$model->alias] = ConnectionManager::getSourceName($ds); - $dummyName = "_sub_query_$sourceName"; - if (!in_array($dummyName, ConnectionManager::sourceList())) { - $config = $ds->config; - $config['datasource'] = $this->_createDatasource($ds); - App::uses($config['datasource'], 'Model/Datasource'); - $new = ConnectionManager::create($dummyName, $config); - $new->setConnection($ds->getConnection()); - } - $model->setDataSource($dummyName); - } - - /** - * Returns the datasource to its original state. - * - * @param Model $model Instance of the model to reset. - */ - protected function _resetDataSource(Model $model) { - $model->setDataSource($this->_nameMap[$model->alias]); - } - - /** - * Creates a dummy datasource which can return SQL. - * - * @param DataSource $ds The datasource to fake. - * @return string Name of the created class. - */ - protected function _createDataSource(DataSource $ds) { - $base = get_class($ds); - $class = "SubQuery$base"; - if (class_exists($class)) { - return $class; - } - $code = <<_sql = \$sql; - return true; - } - - public function getSql() { - return \$this->_sql; - } - - public function setConnection(\$connection) { - \$this->_connection = \$connection; - } -} - -CODE; - eval($code); - return $class; - } }