From 51f6d27edf52aec3888e04d4bb292fa62d3e20ac Mon Sep 17 00:00:00 2001 From: Yuri Kuznetsov Date: Fri, 23 Jul 2021 14:04:53 +0300 Subject: [PATCH] orm relation filter in clone --- application/Espo/ORM/Query/Select.php | 13 ++++++++++ .../Repository/RDBRelationSelectBuilder.php | 24 +++++++++++++++---- 2 files changed, 32 insertions(+), 5 deletions(-) diff --git a/application/Espo/ORM/Query/Select.php b/application/Espo/ORM/Query/Select.php index f8592806ee..101dbb5098 100644 --- a/application/Espo/ORM/Query/Select.php +++ b/application/Espo/ORM/Query/Select.php @@ -29,6 +29,8 @@ namespace Espo\ORM\Query; +use Espo\ORM\Query\Part\WhereClause; + use RuntimeException; /** @@ -85,6 +87,17 @@ class Select implements SelectingQuery return $this->params['orderBy'] ?? []; } + public function getWhere(): ?WhereClause + { + $whereClause = $this->params['whereClause'] ?? null; + + if ($whereClause === null || $whereClause === []) { + return null; + } + + return WhereClause::fromRaw($whereClause); + } + private function validateRawParams(array $params): void { $this->validateRawParamsSelecting($params); diff --git a/application/Espo/ORM/Repository/RDBRelationSelectBuilder.php b/application/Espo/ORM/Repository/RDBRelationSelectBuilder.php index f15d414381..5c1ce901b1 100644 --- a/application/Espo/ORM/Repository/RDBRelationSelectBuilder.php +++ b/application/Espo/ORM/Repository/RDBRelationSelectBuilder.php @@ -88,12 +88,26 @@ class RDBRelationSelectBuilder $this->foreignEntityType = $entity->getRelationParam($relationName, 'entity'); - if ($query) { - $this->builder = $this->createSelectBuilder()->clone($query); - } - else { - $this->builder = $this->createSelectBuilder()->from($this->foreignEntityType); + $this->builder = $query ? + $this->cloneQueryToBuilder($query) : + $this->createSelectBuilder()->from($this->foreignEntityType); + } + + private function cloneQueryToBuilder(Select $query): SelectBuilder + { + $where = $query->getWhere(); + + if ($where === null) { + return $this->createSelectBuilder()->clone($query); } + + $rawQuery = $query->getRaw(); + + $rawQuery['whereClause'] = $this->applyRelationAliasToWhereClause($where->getRaw()); + + $newQuery = Select::fromRaw($rawQuery); + + return $this->createSelectBuilder()->clone($newQuery); } protected function createSelectBuilder(): SelectBuilder