From 01366db31ab3779af2b754cbf668c201ae30acc1 Mon Sep 17 00:00:00 2001 From: Patrick Kenny <33362-ptmkenny@users.noreply.drupalcode.org> Date: Fri, 3 Jan 2025 21:18:55 +0900 Subject: [PATCH] convert patch #48 to MR --- .../Drupal/Core/Entity/Query/Sql/Tables.php | 26 +++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/core/lib/Drupal/Core/Entity/Query/Sql/Tables.php b/core/lib/Drupal/Core/Entity/Query/Sql/Tables.php index a873de2b081b..8d376db666ea 100644 --- a/core/lib/Drupal/Core/Entity/Query/Sql/Tables.php +++ b/core/lib/Drupal/Core/Entity/Query/Sql/Tables.php @@ -363,9 +363,31 @@ protected function ensureEntityTable($index_prefix, $property, $type, $langcode, // and the base table alias. This way, if the same entity table is // joined several times for different entity reference fields, each join // gets a unique alias. - $key = $index_prefix . ($base_table === 'base_table' ? $table : $base_table); + $key = $index_prefix . ($base_table === 'base_table' ? $table : $base_table) . $type; if (!isset($this->entityTables[$key])) { - $this->entityTables[$key] = $this->addJoin($type, $table, "[%alias].[$id_field] = [$base_table].[$id_field]", $langcode); + $tables = $this->sqlQuery->getTables(); + if (isset($tables[$key])) { + $this->entityTables[$key] = $key; + } + elseif ( + $type === 'INNER' && + $base_table === 'base_table' && + $tables['base_table']['table'] === $table + ) { + // When the above conditions are true this is a needless self join to + // the entity base table so don't add a join, and set the table alias + // correctly. + $this->entityTables[$key] = 'base_table'; + } + elseif ( + isset($tables[$table]) && + $tables[$table]['join type'] === $type + ) { + $this->entityTables[$key] = $table; + } + else { + $this->entityTables[$key] = $this->addJoin($type, $table, "[%alias].[$id_field] = [$base_table].[$id_field]", $langcode); + } } return $this->entityTables[$key]; } -- GitLab