Skip to content

Commit 913450d

Browse files
committed
Additional tests for virtualFields and fixing issues with index 0 being removed. Fixes #208
1 parent 570c9e5 commit 913450d

File tree

3 files changed

+39
-11
lines changed

3 files changed

+39
-11
lines changed

cake/libs/model/datasources/dbo_source.php

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1877,18 +1877,19 @@ function fields(&$model, $alias = null, $fields = array(), $quote = true) {
18771877
}
18781878
$virtual = array();
18791879
$virtualFields = $model->getVirtualField();
1880-
if ($virtualFields) {
1881-
$keys = array_keys($virtualFields);
1882-
foreach($keys as $field) {
1883-
$keys[] = $model->alias . '.' . $field;
1880+
if (!empty($virtualFields)) {
1881+
$virtualKeys = array_keys($virtualFields);
1882+
foreach ($virtualKeys as $field) {
1883+
$virtualKeys[] = $model->alias . '.' . $field;
18841884
}
1885-
$virtual = ($allFields) ? $keys : array_intersect($keys, $fields);
1886-
}
1887-
foreach($virtual as &$field) {
1888-
if (strpos($field, '.')) {
1889-
$field = str_replace($model->alias . '.', '', $field);
1890-
$fields = array_diff($fields, array($model->alias . '.' . $field));
1885+
$virtual = ($allFields) ? $virtualKeys : array_intersect($virtualKeys, $fields);
1886+
foreach ($virtual as $i => $field) {
1887+
if (strpos($field, '.') !== false) {
1888+
$virtual[$i] = str_replace($model->alias . '.', '', $field);
1889+
}
1890+
$fields = array_diff($fields, array($field));
18911891
}
1892+
$fields = array_values($fields);
18921893
}
18931894
$count = count($fields);
18941895

@@ -1954,7 +1955,7 @@ function fields(&$model, $alias = null, $fields = array(), $quote = true) {
19541955
}
19551956
}
19561957
if (!empty($virtual)) {
1957-
$fields = array_merge($fields,$this->_constructVirtualFields($model, $alias, $virtual));
1958+
$fields = array_merge($fields, $this->_constructVirtualFields($model, $alias, $virtual));
19581959
}
19591960
return array_unique($fields);
19601961
}

cake/tests/cases/libs/model/datasources/dbo_source.test.php

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4142,6 +4142,13 @@ function testVirtualFields() {
41424142
'(NOW()) AS `Article__this_moment`',
41434143
);
41444144
$this->assertEqual($expected, $result);
4145+
4146+
$result = $this->db->fields($Article, null, array('Article.this_moment', 'Article.title'));
4147+
$expected = array(
4148+
'`Article`.`title`',
4149+
'(NOW()) AS `Article__this_moment`',
4150+
);
4151+
$this->assertEqual($expected, $result);
41454152
}
41464153

41474154
/**

cake/tests/cases/libs/model/model_read.test.php

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7249,6 +7249,26 @@ function testVirtualFields() {
72497249
));
72507250

72517251
$this->assertEqual($result, $expectation);
7252+
7253+
7254+
$Author =& ClassRegistry::init('Author');
7255+
$Author->virtualFields = array(
7256+
'full_name' => 'CONCAT(Author.user, " ", Author.id)'
7257+
);
7258+
7259+
$result = $Author->find('first', array(
7260+
'conditions' => array('Author.user' => 'mariano'),
7261+
'fields' => array('Author.password', 'Author.full_name'),
7262+
'recursive' => -1
7263+
));
7264+
$this->assertTrue(isset($result['Author']['full_name']));
7265+
7266+
$result = $Author->find('first', array(
7267+
'conditions' => array('Author.user' => 'mariano'),
7268+
'fields' => array('Author.full_name', 'Author.password'),
7269+
'recursive' => -1
7270+
));
7271+
$this->assertTrue(isset($result['Author']['full_name']));
72527272
}
72537273

72547274
/**

0 commit comments

Comments
 (0)