Verified Commit 2da39e65 authored by godotislate's avatar godotislate
Browse files

fix: #3585716 EntityQuery uses hard-coded langcode in revision-data joins,...

fix: #3585716 EntityQuery uses hard-coded langcode in revision-data joins, breaking translatable revisionable entities with custom langcode keys

By: lisotton
By: smustgrave
By: godotislate
By: alexpott
(cherry picked from commit 45045440)
parent d0380f86
Loading
Loading
Loading
Loading
Loading
+4 −1
Original line number Diff line number Diff line
@@ -443,7 +443,10 @@ protected function addJoin($type, $table, $join_condition, $langcode, $delta = N
      $entity_type = $this->entityTypeManager->getActiveDefinition($entity_type_id);
      // For a data table, get the entity language key from the entity type.
      // A dedicated field table has a hard-coded 'langcode' column.
      $langcode_key = $entity_type->getDataTable() == $table ? $entity_type->getKey('langcode') : 'langcode';
      $langcode_key = match($table) {
        $entity_type->getDataTable(), $entity_type->getRevisionDataTable() => $entity_type->getKey('langcode'),
        default => 'langcode',
      };
      $placeholder = ':langcode' . $this->sqlQuery->nextPlaceholder();
      $join_condition .= ' AND [%alias].[' . $langcode_key . '] = ' . $placeholder;
      $arguments[$placeholder] = $langcode;
+22 −0
Original line number Diff line number Diff line
@@ -1471,6 +1471,28 @@ public function testConditionOnRevisionMetadataKeys(): void {
    $this->assertEquals($entity->id(), reset($result));
  }

  /**
   * Tests langcode key handling for revision data table joins.
   */
  public function testRevisionDataTableJoinUsesConfiguredLangcodeKey(): void {
    $entity_type_manager = $this->container->get('entity_type.manager');
    $entity_type = $entity_type_manager->getActiveDefinition('entity_test_mulrev');
    $keys = $entity_type->getKeys();
    $keys['langcode'] = 'language';
    $entity_type->set('entity_keys', $keys);

    $query = $this->storage
      ->getQuery()
      ->accessCheck(FALSE)
      ->condition('name.value', $this->randomMachineName(), '=', 'tr')
      ->allRevisions();

    $query_string = (string) $query;
    $this->assertStringContainsString('entity_test_mulrev_property_revision', $query_string);
    $this->assertMatchesRegularExpression('/"entity_test_mulrev_property_revision"\."language"\s*=\s*\'tr\'/', $query_string);
    $this->assertDoesNotMatchRegularExpression('/"entity_test_mulrev_property_revision"\."langcode"\s*=\s*\'tr\'/', $query_string);
  }

  /**
   * Tests __toString().
   */