Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Browse files

Initial implementation of model virtual fields

  • Loading branch information...
commit 19c91f1f70c34e0ab366c90f80a2238eb2c0f837 1 parent df15139
@lorenzo lorenzo authored
View
43 cake/libs/model/datasources/dbo_source.php
@@ -366,9 +366,11 @@ function fetchAll($sql, $cache = true, $modelName = null) {
$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 @@ function fetchAll($sql, $cache = true, $modelName = null) {
}
}
+ 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 @@ function __scrubQueryData($data) {
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 @@ function fields(&$model, $alias = null, $fields = array(), $quote = true) {
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 @@ function fields(&$model, $alias = null, $fields = array(), $quote = true) {
}
}
}
+
+ if (!empty($model->virtualFields)) {
+ if ($allFields) {
+ $fields = array_merge($fields,$this->_constructVirtualFields($model,$model->virtualFields));
+ } else {
+ }
+ }
return array_unique($fields);
}
View
16 cake/tests/cases/libs/model/model_read.test.php
@@ -26,6 +26,22 @@
*/
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()
*
Please sign in to comment.
Something went wrong with that request. Please try again.