diff --git a/cake/libs/model/datasources/dbo_source.php b/cake/libs/model/datasources/dbo_source.php index dcaf89980..1c49445b6 100644 --- a/cake/libs/model/datasources/dbo_source.php +++ b/cake/libs/model/datasources/dbo_source.php @@ -366,9 +366,11 @@ class DboSource extends DataSource { $first = $this->fetchRow(); if ($first != null) { + $this->fetchVirtualField($first); $out[] = $first; } while ($this->hasResult() && $item = $this->fetchResult()) { + $this->fetchVirtualField($item); $out[] = $item; } @@ -386,6 +388,29 @@ class DboSource extends DataSource { } } + function fetchVirtualField(&$result) { + if (isset($result[0]) && is_array($result[0])) { + foreach ($result[0] as $field => $value) { + if (strpos($field,'__') === false) { + continue; + } + list($alias,$virtual) = explode('__',$field); + + if (!ClassRegistry::isKeySet($alias)) { + retrun; + } + $model = ClassRegistry::getObject($alias); + if (isset($model->virtualFields[$virtual])) { + $result[$alias][$virtual] = $value; + unset($result[0][$field]); + } + } + if (empty($result[0])) { + unset($result[0]); + } + } + } + /** * Returns a single field of the first of query results for a given SQL query, or false if empty. * @@ -1733,6 +1758,14 @@ class DboSource extends DataSource { return $data; } + function _constructVirtualFields(&$model,$fields) { + $virtual = array(); + foreach ($fields as $name => $expression) { + $virtual[] = $expression . " {$this->alias} {$model->alias}__{$name}"; + } + return $virtual; + } + /** * Generates the fields list of an SQL query. * @@ -1746,7 +1779,8 @@ class DboSource extends DataSource { if (empty($alias)) { $alias = $model->alias; } - if (empty($fields)) { + $allFields = empty($fields); + if ($allFields) { $fields = array_keys($model->schema()); } elseif (!is_array($fields)) { $fields = String::tokenize($fields); @@ -1813,6 +1847,13 @@ class DboSource extends DataSource { } } } + + if (!empty($model->virtualFields)) { + if ($allFields) { + $fields = array_merge($fields,$this->_constructVirtualFields($model,$model->virtualFields)); + } else { + } + } return array_unique($fields); } diff --git a/cake/tests/cases/libs/model/model_read.test.php b/cake/tests/cases/libs/model/model_read.test.php index 86b855900..2fd4978a7 100644 --- a/cake/tests/cases/libs/model/model_read.test.php +++ b/cake/tests/cases/libs/model/model_read.test.php @@ -26,6 +26,22 @@ require_once dirname(__FILE__) . DS . 'model.test.php'; */ class ModelReadTest extends BaseModelTest { + function testVirtualFields() { + $this->loadFixtures('Post'); + $Post = ClassRegistry::init('Post'); + $Post->virtualFields = array('two' => "1 + 1"); + $expected = array( + 'author_id' => 1, + 'title' => 'First Post', + 'body' => 'First Post Body', + 'published' => 'Y', + 'created' => '2007-03-18 10:39:23', + 'updated' => '2007-03-18 10:41:31' + ); + debug($Post->find('first')); + exit; + } + /** * testFetchingNonUniqueFKJoinTableRecords() *