diff --git a/cake/libs/model/datasources/dbo_source.php b/cake/libs/model/datasources/dbo_source.php index 7af467027..2dbfc623d 100755 --- a/cake/libs/model/datasources/dbo_source.php +++ b/cake/libs/model/datasources/dbo_source.php @@ -1185,7 +1185,6 @@ class DboSource extends DataSource { } return null; } - $count = count($resultSet); if ($type === 'hasMany' && empty($assocData['limit']) && !empty($assocData['foreignKey'])) { $ins = $fetch = array(); @@ -1219,7 +1218,7 @@ class DboSource extends DataSource { } } $this->_filterResults($fetch, $model); - return $this->__mergeHasMany($resultSet, $fetch, $association, $model, $linkModel, $recursive); + return $this->__mergeHasMany($resultSet, $fetch, $association, $model, $linkModel); } elseif ($type === 'hasAndBelongsToMany') { $ins = $fetch = array(); foreach ($resultSet as &$result) { @@ -1252,6 +1251,8 @@ class DboSource extends DataSource { } } + $modelAlias = $model->alias; + $modelPK = $model->primaryKey; foreach ($resultSet as &$row) { if ($type !== 'hasAndBelongsToMany') { $q = $this->insertQueryData($query, $row, $association, $assocData, $model, $linkModel, $stack); @@ -1269,7 +1270,7 @@ class DboSource extends DataSource { foreach ($linkModel->{$type1} as $assoc1 => $assocData1) { $deepModel = $linkModel->{$assoc1}; - if ($type1 === 'belongsTo' || ($deepModel->alias === $model->alias && $type === 'belongsTo') || ($deepModel->alias != $model->alias)) { + if ($type1 === 'belongsTo' || ($deepModel->alias === $modelAlias && $type === 'belongsTo') || ($deepModel->alias !== $modelAlias)) { $tmpStack = $stack; $tmpStack[] = $assoc1; if ($linkModel->useDbConfig == $deepModel->useDbConfig) { @@ -1286,7 +1287,7 @@ class DboSource extends DataSource { $uniqueIds = $merge = array(); foreach ($fetch as $j => $data) { - if (isset($data[$with]) && $data[$with][$foreignKey] === $row[$model->alias][$model->primaryKey]) { + if (isset($data[$with]) && $data[$with][$foreignKey] === $row[$modelAlias][$modelPK]) { if ($habtmFieldsCount <= 2) { unset($data[$with]); } @@ -1339,12 +1340,17 @@ class DboSource extends DataSource { * @param object $linkModel Model being merged * @return void */ - function __mergeHasMany(&$resultSet, $merge, $association, &$model, &$linkModel) { - foreach ($resultSet as $i => $value) { - $count = 0; - $merged[$association] = array(); - foreach ($merge as $j => $data) { - if (isset($value[$model->alias]) && $value[$model->alias][$model->primaryKey] === $data[$association][$model->hasMany[$association]['foreignKey']]) { + function __mergeHasMany(&$resultSet, $merge, $association, $model, $linkModel) { + $modelAlias = $model->alias; + $modelPK = $model->primaryKey; + $modelFK = $model->hasMany[$association]['foreignKey']; + foreach ($resultSet as &$result) { + if (!isset($result[$modelAlias])) { + continue; + } + $merged = array(); + foreach ($merge as $data) { + if ($result[$modelAlias][$modelPK] === $data[$association][$modelFK]) { if (count($data) > 1) { $data = array_merge($data[$association], $data); unset($data[$association]); @@ -1354,17 +1360,13 @@ class DboSource extends DataSource { unset($data[$key]); } } - $merged[$association][] = $data; + $merged[] = $data; } else { - $merged[$association][] = $data[$association]; + $merged[] = $data[$association]; } } - $count++; - } - if (isset($value[$model->alias])) { - $resultSet[$i] = Set::pushDiff($resultSet[$i], $merged); - unset($merged); } + $result = Set::pushDiff($result, array($association => $merged)); } } @@ -1378,18 +1380,18 @@ class DboSource extends DataSource { * @param boolean $selfJoin * @access private */ - function __mergeAssociation(&$data, $merge, $association, $type, $selfJoin = false) { + function __mergeAssociation(&$data, &$merge, $association, $type, $selfJoin = false) { if (isset($merge[0]) && !isset($merge[0][$association])) { $association = Inflector::pluralize($association); } - if ($type == 'belongsTo' || $type == 'hasOne') { + if ($type === 'belongsTo' || $type === 'hasOne') { if (isset($merge[$association])) { $data[$association] = $merge[$association][0]; } else { if (count($merge[0][$association]) > 1) { foreach ($merge[0] as $assoc => $data2) { - if ($assoc != $association) { + if ($assoc !== $association) { $merge[0][$association][$assoc] = $data2; } }