From 62d2157fd8e1d2bbac9c3591b28d36f5570175ae Mon Sep 17 00:00:00 2001 From: Yuri Kuznetsov Date: Tue, 6 Apr 2021 12:07:02 +0300 Subject: [PATCH] fix orm sub query entity type --- .../ORM/QueryComposer/BaseQueryComposer.php | 16 ++++----- .../unit/Espo/ORM/MysqlQueryComposerTest.php | 35 +++++++++++++++++++ 2 files changed, 42 insertions(+), 9 deletions(-) diff --git a/application/Espo/ORM/QueryComposer/BaseQueryComposer.php b/application/Espo/ORM/QueryComposer/BaseQueryComposer.php index 082d5fd2af..005d275dde 100644 --- a/application/Espo/ORM/QueryComposer/BaseQueryComposer.php +++ b/application/Espo/ORM/QueryComposer/BaseQueryComposer.php @@ -2476,27 +2476,25 @@ abstract class BaseQueryComposer implements QueryComposer return '0'; } - if (!empty($value['entityType'])) { - $subQueryEntityType = $value['entityType']; - } else { - $subQueryEntityType = $entity->getEntityType(); - } - $subQuerySelectParams = []; if (!empty($value['selectParams'])) { $subQuerySelectParams = $value['selectParams']; - } else { + } + else { $subQuerySelectParams = $value; } - $subQueryEntityType = $subQuerySelectParams['from'] ?? $subQueryEntityType; + if (!isset($subQuerySelectParams['from']) && !isset($subQuerySelectParams['fromQuery'])) { + // 'entityType' is for backward compatibility. + $subQuerySelectParams['from'] = $value['entityType'] ?? $entity->getEntityType(); + } if (!empty($value['withDeleted'])) { $subQuerySelectParams['withDeleted'] = true; } - $subSql = $this->createSelectQuery($subQueryEntityType, $subQuerySelectParams); + $subSql = $this->createSelectQueryInternal($subQuerySelectParams); return $leftPart . " {$operator} ({$subSql})"; } diff --git a/tests/unit/Espo/ORM/MysqlQueryComposerTest.php b/tests/unit/Espo/ORM/MysqlQueryComposerTest.php index ad24003ec0..0b7c7468d2 100644 --- a/tests/unit/Espo/ORM/MysqlQueryComposerTest.php +++ b/tests/unit/Espo/ORM/MysqlQueryComposerTest.php @@ -1885,6 +1885,41 @@ class MysqlQueryComposerTest extends \PHPUnit\Framework\TestCase $this->assertEquals($expectedSql, $sql); } + public function testSelectSubQuery3() + { + $queryBuilder = new QueryBuilder(); + + $subQuery2 = $queryBuilder + ->select() + ->select('\'test\'', 'test') + ->build(); + + $subQuery1 = $queryBuilder + ->select() + ->fromQuery($subQuery2, 't') + ->select('t.test', 'value') + ->build(); + + $query = $queryBuilder + ->select() + ->from('Test') + ->select('id') + ->where([ + 'id=s' => $subQuery1->getRaw(), + ]) + ->build(); + + $sql = $this->query->compose($query); + + $expectedSql = + "SELECT test.id AS `id` FROM `test` " . + "WHERE test.id IN " . + "(SELECT t.test AS `value` FROM (SELECT 'test' AS `test`) AS `t`) AND " . + "test.deleted = 0"; + + $this->assertEquals($expectedSql, $sql); + } + public function testSelectNoFrom1() { $queryBuilder = new QueryBuilder();