You are here

protected function Query::prepare in Drupal 10

Same name in this branch
  1. 10 core/modules/workspaces/src/EntityQuery/Query.php \Drupal\workspaces\EntityQuery\Query::prepare()
  2. 10 core/lib/Drupal/Core/Entity/Query/Sql/Query.php \Drupal\Core\Entity\Query\Sql\Query::prepare()
Same name and namespace in other branches
  1. 8 core/lib/Drupal/Core/Entity/Query/Sql/Query.php \Drupal\Core\Entity\Query\Sql\Query::prepare()
  2. 9 core/lib/Drupal/Core/Entity/Query/Sql/Query.php \Drupal\Core\Entity\Query\Sql\Query::prepare()

Prepares the basic query with proper metadata/tags and base fields.

Return value

$this Returns the called object.

Throws

\Drupal\Core\Entity\Query\QueryException Thrown if the base table does not exist.

File

core/lib/Drupal/Core/Entity/Query/Sql/Query.php, line 95

Class

Query
The SQL storage entity query class.

Namespace

Drupal\Core\Entity\Query\Sql

Code

protected function prepare() {
  if ($this->allRevisions) {
    if (!($base_table = $this->entityType
      ->getRevisionTable())) {
      throw new QueryException("No revision table for " . $this->entityTypeId . ", invalid query.");
    }
  }
  else {
    if (!($base_table = $this->entityType
      ->getBaseTable())) {
      throw new QueryException("No base table for " . $this->entityTypeId . ", invalid query.");
    }
  }
  $simple_query = TRUE;
  if ($this->entityType
    ->getDataTable()) {
    $simple_query = FALSE;
  }
  $this->sqlQuery = $this->connection
    ->select($base_table, 'base_table', [
    'conjunction' => $this->conjunction,
  ]);

  // Reset the tables structure, as it might have been built for a previous
  // execution of this query.
  $this->tables = NULL;
  $this->sqlQuery
    ->addMetaData('entity_type', $this->entityTypeId);
  $id_field = $this->entityType
    ->getKey('id');

  // Add the key field for fetchAllKeyed().
  if (!($revision_field = $this->entityType
    ->getKey('revision'))) {

    // When there is no revision support, the key field is the entity key.
    $this->sqlFields["base_table.{$id_field}"] = [
      'base_table',
      $id_field,
    ];

    // Now add the value column for fetchAllKeyed(). This is always the
    // entity id.
    $this->sqlFields["base_table.{$id_field}" . '_1'] = [
      'base_table',
      $id_field,
    ];
  }
  else {

    // When there is revision support, the key field is the revision key.
    $this->sqlFields["base_table.{$revision_field}"] = [
      'base_table',
      $revision_field,
    ];

    // Now add the value column for fetchAllKeyed(). This is always the
    // entity id.
    $this->sqlFields["base_table.{$id_field}"] = [
      'base_table',
      $id_field,
    ];
  }

  // Add a self-join to the base revision table if we're querying only the
  // latest revisions.
  if ($this->latestRevision && $revision_field) {
    $this->sqlQuery
      ->leftJoin($base_table, 'base_table_2', "[base_table].[{$id_field}] = [base_table_2].[{$id_field}] AND [base_table].[{$revision_field}] < [base_table_2].[{$revision_field}]");
    $this->sqlQuery
      ->isNull("base_table_2.{$id_field}");
  }
  if (is_null($this->accessCheck)) {
    throw new QueryException('Entity queries must explicitly set whether the query should be access checked or not. See Drupal\\Core\\Entity\\Query\\QueryInterface::accessCheck().');
  }
  if ($this->accessCheck) {
    $this->sqlQuery
      ->addTag($this->entityTypeId . '_access');
  }
  $this->sqlQuery
    ->addTag('entity_query');
  $this->sqlQuery
    ->addTag('entity_query_' . $this->entityTypeId);

  // Add further tags added.
  if (isset($this->alterTags)) {
    foreach ($this->alterTags as $tag => $value) {
      $this->sqlQuery
        ->addTag($tag);
    }
  }

  // Add further metadata added.
  if (isset($this->alterMetaData)) {
    foreach ($this->alterMetaData as $key => $value) {
      $this->sqlQuery
        ->addMetaData($key, $value);
    }
  }

  // This now contains first the table containing entity properties and
  // last the entity base table. They might be the same.
  $this->sqlQuery
    ->addMetaData('all_revisions', $this->allRevisions);
  $this->sqlQuery
    ->addMetaData('simple_query', $simple_query);
  return $this;
}