From c033df3218e0fbf8f38a950793f6d58082531f21 Mon Sep 17 00:00:00 2001 From: k-halaburda Date: Fri, 9 Aug 2013 09:56:33 +0200 Subject: [PATCH] Fixed duplication of Model's afterFind callback in HABTM relation and content of array passed to that callback [ticket 3970] --- app/Config/database.php.default | 79 ------------------------- lib/Cake/Model/Datasource/DboSource.php | 12 +++- 2 files changed, 9 insertions(+), 82 deletions(-) delete mode 100644 app/Config/database.php.default diff --git a/app/Config/database.php.default b/app/Config/database.php.default deleted file mode 100644 index e3f5985b5..000000000 --- a/app/Config/database.php.default +++ /dev/null @@ -1,79 +0,0 @@ - The name of a supported datasource; valid options are as follows: - * Database/Mysql - MySQL 4 & 5, - * Database/Sqlite - SQLite (PHP5 only), - * Database/Postgres - PostgreSQL 7 and higher, - * Database/Sqlserver - Microsoft SQL Server 2005 and higher - * - * You can add custom database datasources (or override existing datasources) by adding the - * appropriate file to app/Model/Datasource/Database. Datasources should be named 'MyDatasource.php', - * - * - * persistent => true / false - * Determines whether or not the database should use a persistent connection - * - * host => - * the host you connect to the database. To add a socket or port number, use 'port' => # - * - * prefix => - * Uses the given prefix for all the tables in this database. This setting can be overridden - * on a per-table basis with the Model::$tablePrefix property. - * - * schema => - * For Postgres/Sqlserver specifies which schema you would like to use the tables in. Postgres defaults to 'public'. For Sqlserver, it defaults to empty and use - * the connected user's default schema (typically 'dbo'). - * - * encoding => - * For MySQL, Postgres specifies the character encoding to use when connecting to the - * database. Uses database default not specified. - * - * unix_socket => - * For MySQL to connect via socket specify the `unix_socket` parameter instead of `host` and `port` - */ -class DATABASE_CONFIG { - - public $default = array( - 'datasource' => 'Database/Mysql', - 'persistent' => false, - 'host' => 'localhost', - 'login' => 'user', - 'password' => 'password', - 'database' => 'database_name', - 'prefix' => '', - //'encoding' => 'utf8', - ); - - public $test = array( - 'datasource' => 'Database/Mysql', - 'persistent' => false, - 'host' => 'localhost', - 'login' => 'user', - 'password' => 'password', - 'database' => 'test_database_name', - 'prefix' => '', - //'encoding' => 'utf8', - ); -} diff --git a/lib/Cake/Model/Datasource/DboSource.php b/lib/Cake/Model/Datasource/DboSource.php index abdad2437..120ab17e0 100644 --- a/lib/Cake/Model/Datasource/DboSource.php +++ b/lib/Cake/Model/Datasource/DboSource.php @@ -1112,7 +1112,7 @@ class DboSource extends DataSource { $db->queryAssociation($model, $linkModel, $type, $assoc, $assocData, $array, true, $resultSet, $model->recursive - 1, $stack); unset($db); - if ($type === 'hasMany') { + if ($type === 'hasMany' || $type === 'hasAndBelongsToMany') { $filtered[] = $assoc; } } @@ -1138,7 +1138,10 @@ class DboSource extends DataSource { * @return array Array of results that have been filtered through $model->afterFind */ protected function _filterResults(&$results, Model $model, $filtered = array()) { - $current = reset($results); + if (!is_array($results)) { + return array(); + } + $current = reset($results); if (!is_array($current)) { return array(); } @@ -1252,6 +1255,9 @@ class DboSource extends DataSource { } else { $fetch = null; } + if ($queryData['callbacks'] === true || $queryData['callbacks'] === 'after') { + $this->_filterResults($fetch, $model); + } } $modelAlias = $model->alias; @@ -1312,7 +1318,7 @@ class DboSource extends DataSource { } else { $this->_mergeAssociation($row, $fetch, $association, $type, $selfJoin); } - if (isset($row[$association])) { + if (isset($row[$association]) && $type !== 'hasAndBelongsToMany') { $row[$association] = $linkModel->afterFind($row[$association], false); } } else {