Skip to content

Commit 49c93c1

Browse files
author
Stanislav Idolov
authored
ENGCOM-3449: [Forwardport] Fix/add expresion #19180
2 parents 3bbe7f9 + 61938e9 commit 49c93c1

File tree

2 files changed

+48
-2
lines changed

2 files changed

+48
-2
lines changed

dev/tests/integration/testsuite/Magento/Framework/Model/ResourceModel/Db/Collection/AbstractTest.php

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,4 +72,42 @@ public function testGetAllIdsWithBind()
7272
$this->_model->addBindParam('code', 'admin');
7373
$this->assertEquals(['0'], $this->_model->getAllIds());
7474
}
75+
76+
/**
77+
* Check add field to select doesn't remove expression field from select.
78+
*
79+
* @return void
80+
*/
81+
public function testAddExpressionFieldToSelectWithAdditionalFields()
82+
{
83+
$expectedColumns = ['code', 'test_field'];
84+
$actualColumns = [];
85+
86+
$testExpression = new \Zend_Db_Expr('(sort_order + group_id)');
87+
$this->_model->addExpressionFieldToSelect('test_field', $testExpression, ['sort_order', 'group_id']);
88+
$this->_model->addFieldToSelect('code', 'code');
89+
$columns = $this->_model->getSelect()->getPart(\Magento\Framework\DB\Select::COLUMNS);
90+
foreach ($columns as $columnEntry) {
91+
$actualColumns[] = $columnEntry[2];
92+
}
93+
94+
$this->assertEquals($expectedColumns, $actualColumns);
95+
}
96+
97+
/**
98+
* Check add expression field doesn't remove all fields from select.
99+
*
100+
* @return void
101+
*/
102+
public function testAddExpressionFieldToSelectWithoutAdditionalFields()
103+
{
104+
$expectedColumns = ['*', 'test_field'];
105+
106+
$testExpression = new \Zend_Db_Expr('(sort_order + group_id)');
107+
$this->_model->addExpressionFieldToSelect('test_field', $testExpression, ['sort_order', 'group_id']);
108+
$columns = $this->_model->getSelect()->getPart(\Magento\Framework\DB\Select::COLUMNS);
109+
$actualColumns = [$columns[0][1], $columns[1][2]];
110+
111+
$this->assertEquals($expectedColumns, $actualColumns);
112+
}
75113
}

lib/internal/Magento/Framework/Model/ResourceModel/Db/Collection/AbstractCollection.php

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,13 @@ abstract class AbstractCollection extends AbstractDb implements SourceProviderIn
4545
*/
4646
protected $_fieldsToSelect = null;
4747

48+
/**
49+
* Expression fields to select in query.
50+
*
51+
* @var array
52+
*/
53+
private $expressionFieldsToSelect = [];
54+
4855
/**
4956
* Fields initial fields to select like id_field
5057
*
@@ -170,7 +177,7 @@ public function setMainTable($table)
170177
}
171178

172179
/**
173-
* {@inheritdoc}
180+
* @inheritdoc
174181
*/
175182
protected function _initSelect()
176183
{
@@ -205,7 +212,7 @@ protected function _initSelectFields()
205212
$columnsToSelect = [];
206213
foreach ($columns as $columnEntry) {
207214
list($correlationName, $column, $alias) = $columnEntry;
208-
if ($correlationName !== 'main_table') {
215+
if ($correlationName !== 'main_table' || isset($this->expressionFieldsToSelect[$alias])) {
209216
// Add joined fields to select
210217
if ($column instanceof \Zend_Db_Expr) {
211218
$column = $column->__toString();
@@ -347,6 +354,7 @@ public function addExpressionFieldToSelect($alias, $expression, $fields)
347354
}
348355

349356
$this->getSelect()->columns([$alias => $fullExpression]);
357+
$this->expressionFieldsToSelect[$alias] = $fullExpression;
350358

351359
return $this;
352360
}

0 commit comments

Comments
 (0)