mirror of
https://github.com/kamilwylegala/cakephp2-php8.git
synced 2025-01-19 02:56:15 +00:00
Initial implementation of model virtual fields
This commit is contained in:
parent
df151395c5
commit
19c91f1f70
2 changed files with 58 additions and 1 deletions
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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()
|
||||
*
|
||||
|
|
Loading…
Add table
Reference in a new issue