diff --git a/cake/libs/model/datasources/dbo_source.php b/cake/libs/model/datasources/dbo_source.php index a7aded72939..db6727cd530 100644 --- a/cake/libs/model/datasources/dbo_source.php +++ b/cake/libs/model/datasources/dbo_source.php @@ -369,7 +369,6 @@ function fetchAll($sql, $cache = true, $modelName = null) { $first = $this->fetchRow(); if ($first != null) { - $this->fetchVirtualField($first); $out[] = $first; } while ($this->hasResult() && $item = $this->fetchResult()) { @@ -391,6 +390,12 @@ function fetchAll($sql, $cache = true, $modelName = null) { } } +/** + * Modifies $result array to place virtual fields in model entry where they belongs to + * + * @param array $resut REference to the fetched row + * @return void + */ function fetchVirtualField(&$result) { if (isset($result[0]) && is_array($result[0])) { foreach ($result[0] as $field => $value) { @@ -1789,6 +1794,14 @@ function __scrubQueryData($data) { return $data; } +/** + * Converts model virtual fields into sql expressions to be fetched later + * + * @param Model $model + * @param string $alias Alias tablename + * @param mixed $fields virtual fields to be used on query + * @return array + */ function _constructVirtualFields(&$model,$alias,$fields) { $virtual = array(); foreach ($fields as $field) { diff --git a/cake/tests/cases/libs/model/model_read.test.php b/cake/tests/cases/libs/model/model_read.test.php index 97fcfbc76b2..6d53b0996ac 100644 --- a/cake/tests/cases/libs/model/model_read.test.php +++ b/cake/tests/cases/libs/model/model_read.test.php @@ -26,6 +26,15 @@ */ class ModelReadTest extends BaseModelTest { +/** + * testVirtualFields() + * + * Test correct fetching of virtual fields + * currently is not possible to do Relation.virtualField + * + * @access public + * @return void + */ function testVirtualFields() { $this->loadFixtures('Post','Author'); $Post = ClassRegistry::init('Post'); @@ -48,6 +57,16 @@ function testVirtualFields() { $result = $Post->find('first',array('fields' => array('two'))); $this->assertEqual($result['Post']['two'],2); + + $Post->id = 1; + $result = $Post->field('two'); + $this->assertEqual($result,2); + + ClassRegistry::flush(); + $Writing = ClassRegistry::init(array('class' => 'Post', 'alias' => 'Writing'),'Model'); + $Writing->virtualFields = array('two' => "1 + 1"); + $result = $Writing->find('first'); + $this->assertEqual($result['Writing']['two'],2); } /**