public function DatabaseStorageController::load

Implements Drupal\Core\Entity\EntityStorageControllerInterface::load().

Overrides EntityStorageControllerInterface::load

1 call to DatabaseStorageController::load()

File

drupal/core/lib/Drupal/Core/Entity/DatabaseStorageController.php, line 160
Definition of Drupal\Core\Entity\DatabaseStorageController.

Class

DatabaseStorageController
Defines a base entity controller class.

Namespace

Drupal\Core\Entity

Code

public function load(array $ids = NULL) {
  $entities = array();

  // Create a new variable which is either a prepared version of the $ids
  // array for later comparison with the entity cache, or FALSE if no $ids
  // were passed. The $ids array is reduced as items are loaded from cache,
  // and we need to know if it's empty for this reason to avoid querying the
  // database when all requested entities are loaded from cache.
  $passed_ids = !empty($ids) ? array_flip($ids) : FALSE;

  // Try to load entities from the static cache, if the entity type supports
  // static caching.
  if ($this->cache && $ids) {
    $entities += $this
      ->cacheGet($ids);

    // If any entities were loaded, remove them from the ids still to load.
    if ($passed_ids) {
      $ids = array_keys(array_diff_key($passed_ids, $entities));
    }
  }

  // Load any remaining entities from the database. This is the case if $ids
  // is set to NULL (so we load all entities) or if there are any ids left to
  // load.
  if ($ids === NULL || $ids) {

    // Build and execute the query.
    $query_result = $this
      ->buildQuery($ids)
      ->execute();
    if (!empty($this->entityInfo['class'])) {

      // We provide the necessary arguments for PDO to create objects of the
      // specified entity class.
      // @see Drupal\Core\Entity\EntityInterface::__construct()
      $query_result
        ->setFetchMode(PDO::FETCH_CLASS, $this->entityInfo['class'], array(
        array(),
        $this->entityType,
      ));
    }
    $queried_entities = $query_result
      ->fetchAllAssoc($this->idKey);
  }

  // Pass all entities loaded from the database through $this->attachLoad(),
  // which attaches fields (if supported by the entity type) and calls the
  // entity type specific load callback, for example hook_node_load().
  if (!empty($queried_entities)) {
    $this
      ->attachLoad($queried_entities);
    $entities += $queried_entities;
  }
  if ($this->cache) {

    // Add entities to the cache.
    if (!empty($queried_entities)) {
      $this
        ->cacheSet($queried_entities);
    }
  }

  // Ensure that the returned array is ordered the same as the original
  // $ids array if this was passed in and remove any invalid ids.
  if ($passed_ids) {

    // Remove any invalid ids from the array.
    $passed_ids = array_intersect_key($passed_ids, $entities);
    foreach ($entities as $entity) {
      $passed_ids[$entity
        ->id()] = $entity;
    }
    $entities = $passed_ids;
  }
  return $entities;
}