From abd52c7a42eebbae090334be49fc2e2808848f3b Mon Sep 17 00:00:00 2001 From: Yuri Kuznetsov Date: Tue, 23 Feb 2021 16:59:43 +0200 Subject: [PATCH] orm fixes --- .../ORM/QueryComposer/BaseQueryComposer.php | 6 +-- .../unit/Espo/ORM/MysqlQueryComposerTest.php | 38 +++++++++++++++++++ tests/unit/testData/DB/ormMetadata.php | 9 ++++- 3 files changed, 49 insertions(+), 4 deletions(-) diff --git a/application/Espo/ORM/QueryComposer/BaseQueryComposer.php b/application/Espo/ORM/QueryComposer/BaseQueryComposer.php index c2038cd9e9..082d5fd2af 100644 --- a/application/Espo/ORM/QueryComposer/BaseQueryComposer.php +++ b/application/Espo/ORM/QueryComposer/BaseQueryComposer.php @@ -1400,9 +1400,9 @@ abstract class BaseQueryComposer implements QueryComposer if (!empty($defs['select'])) { $expression = $defs['select']; - if ($alias) { - $expression = str_replace('{alias}', $alias, $expression); - } + $alias = $alias ?? $this->getFromAlias($params, $entity->getEntityType()); + + $expression = str_replace('{alias}', $alias, $expression); $pair = $this->getSelectPartItemPair($entity, $params, $expression); diff --git a/tests/unit/Espo/ORM/MysqlQueryComposerTest.php b/tests/unit/Espo/ORM/MysqlQueryComposerTest.php index f7cbf96b31..ad24003ec0 100644 --- a/tests/unit/Espo/ORM/MysqlQueryComposerTest.php +++ b/tests/unit/Espo/ORM/MysqlQueryComposerTest.php @@ -1682,6 +1682,26 @@ class MysqlQueryComposerTest extends \PHPUnit\Framework\TestCase $this->assertEquals($expectedSql, $sql); } + public function testCustomOrder2() + { + $queryBuilder = new QueryBuilder(); + + $select = $queryBuilder->select() + ->from('TestSelect') + ->select(['test']) + ->order('test') + ->build(); + + $sql = $this->query->compose($select); + + $expectedSql = + "SELECT (test_select.id * 1) AS `test` " . + "FROM `test_select` " . + "ORDER BY (alias.id * 1) ASC"; + + $this->assertEquals($expectedSql, $sql); + } + public function testCustomSelect1() { $queryBuilder = new QueryBuilder(); @@ -1741,6 +1761,24 @@ class MysqlQueryComposerTest extends \PHPUnit\Framework\TestCase $this->assertEquals($expectedSql, $sql); } + public function testCustomSelect4() + { + $queryBuilder = new QueryBuilder(); + + $select = $queryBuilder->select() + ->from('TestSelect') + ->select(['testAnother']) + ->build(); + + $sql = $this->query->compose($select); + + $expectedSql = + "SELECT (test_select.id * 1) AS `testAnother` ". + "FROM `test_select`"; + + $this->assertEquals($expectedSql, $sql); + } + public function testSelectValue1() { $queryBuilder = new QueryBuilder(); diff --git a/tests/unit/testData/DB/ormMetadata.php b/tests/unit/testData/DB/ormMetadata.php index edef330368..bcc76e461b 100644 --- a/tests/unit/testData/DB/ormMetadata.php +++ b/tests/unit/testData/DB/ormMetadata.php @@ -522,7 +522,7 @@ return [ 'type' => Entity::VARCHAR, 'notStorable' => true, 'select' => [ - 'select' => 'MUL:(id, 1)', + 'select' => 'MUL:({id, 1)', ], 'selectForeign' => [ 'select' => 'MUL:({alias}.id, 1)', @@ -533,6 +533,13 @@ return [ ], ], ], + 'testAnother' => [ + 'type' => Entity::VARCHAR, + 'notStorable' => true, + 'select' => [ + 'select' => 'MUL:({alias}.id, 1)', + ], + ], ], 'relations' => [ 'right' => [