Skip to content

Commit

Permalink
Allow expression objects in virtual fields.
Browse files Browse the repository at this point in the history
Merge branch 'issue-11871' into 2.x

Refs #11871
  • Loading branch information
markstory committed Apr 3, 2018
2 parents 157c381 + 7a3b66b commit ab5578d
Show file tree
Hide file tree
Showing 2 changed files with 48 additions and 2 deletions.
14 changes: 12 additions & 2 deletions lib/Cake/Model/Datasource/DboSource.php
Original file line number Diff line number Diff line change
Expand Up @@ -2578,7 +2578,12 @@ protected function _constructVirtualFields(Model $Model, $alias, $fields) {
$virtual = array();
foreach ($fields as $field) {
$virtualField = $this->name($alias . $this->virtualFieldSeparator . $field);
$expression = $this->_quoteFields($Model->getVirtualField($field));
$virtualFieldExpression = $Model->getVirtualField($field);
if (is_object($virtualFieldExpression) && $virtualFieldExpression->type == 'expression') {
$expression = $virtualFieldExpression->value;
} else {
$expression = $this->_quoteFields($virtualFieldExpression);
}
$virtual[] = '(' . $expression . ") {$this->alias} {$virtualField}";
}
return $virtual;
Expand Down Expand Up @@ -2887,7 +2892,12 @@ protected function _parseKey($key, $value, Model $Model = null) {

if ($Model !== null) {
if ($Model->isVirtualField($key)) {
$key = $this->_quoteFields($Model->getVirtualField($key));
$virtualField = $Model->getVirtualField($key);
if (is_object($virtualField) && $virtualField->type == 'expression') {
$key = $virtualField->value;
} else {
$key = $this->_quoteFields($virtualField);
}
$virtual = true;
}

Expand Down
36 changes: 36 additions & 0 deletions lib/Cake/Test/Case/Model/Datasource/DboSourceTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -1650,6 +1650,42 @@ public function testConditionKeysToString() {
$this->assertEquals($expected, $result[0]);
}

/**
* Test conditionKeysToString() with virtual field
*
* @return void
*/
public function testConditionKeysToStringVirtualFieldExpression() {
$Article = ClassRegistry::init('Article');
$Article->virtualFields = array(
'extra' => $Article->getDataSource()->expression('something virtual')
);
$conn = $this->getMock('MockPDO', array('quote'));
$db = new DboTestSource();
$db->setConnection($conn);

$conn->expects($this->at(0))
->method('quote')
->will($this->returnValue('just text'));

$conditions = array('Article.extra' => 'just text');
$result = $db->conditionKeysToString($conditions, true, $Article);
$expected = "(" . $Article->virtualFields['extra']->value . ") = just text";
$this->assertEquals($expected, $result[0]);

$conn->expects($this->at(0))
->method('quote')
->will($this->returnValue('just text'));
$conn->expects($this->at(1))
->method('quote')
->will($this->returnValue('other text'));

$conditions = array('Article.extra' => array('just text', 'other text'));
$result = $db->conditionKeysToString($conditions, true, $Article);
$expected = "(" . $Article->virtualFields['extra']->value . ") IN (just text, other text)";
$this->assertEquals($expected, $result[0]);
}

/**
* Test conditionKeysToString() with virtual field
*
Expand Down

0 comments on commit ab5578d

Please sign in to comment.