function Sql::loadEntities
Same name in other branches
- 9 core/modules/views/src/Plugin/views/query/Sql.php \Drupal\views\Plugin\views\query\Sql::loadEntities()
- 8.9.x core/modules/views/src/Plugin/views/query/Sql.php \Drupal\views\Plugin\views\query\Sql::loadEntities()
- 11.x core/modules/views/src/Plugin/views/query/Sql.php \Drupal\views\Plugin\views\query\Sql::loadEntities()
Loads all entities contained in the passed-in $results.
If the entity belongs to the base table, then it gets stored in $result->_entity. Otherwise, it gets stored in $result->_relationship_entities[$relationship_id];
Parameters
\Drupal\views\ResultRow[] $results: The result of the SQL query.
Overrides QueryPluginBase::loadEntities
1 call to Sql::loadEntities()
- Sql::execute in core/
modules/ views/ src/ Plugin/ views/ query/ Sql.php - Executes the query and fills associated view object with according values.
File
-
core/
modules/ views/ src/ Plugin/ views/ query/ Sql.php, line 1586
Class
- Sql
- Views query plugin for an SQL query.
Namespace
Drupal\views\Plugin\views\queryCode
public function loadEntities(&$results) {
$entity_information = $this->getEntityTableInfo();
// No entity tables found, nothing else to do here.
if (empty($entity_information)) {
return;
}
// Extract all entity types from entity_information.
$entity_types = [];
foreach ($entity_information as $info) {
$entity_type = $info['entity_type'];
if (!isset($entity_types[$entity_type])) {
$entity_types[$entity_type] = $this->entityTypeManager
->getDefinition($entity_type);
}
}
// Assemble a list of entities to load.
$entity_ids_by_type = [];
$revision_ids_by_type = [];
foreach ($entity_information as $info) {
$relationship_id = $info['relationship_id'];
$entity_type = $info['entity_type'];
/** @var \Drupal\Core\Entity\EntityTypeInterface $entity_info */
$entity_info = $entity_types[$entity_type];
$revision = $info['revision'];
$id_key = !$revision ? $entity_info->getKey('id') : $entity_info->getKey('revision');
$id_alias = $this->getFieldAlias($info['alias'], $id_key);
foreach ($results as $index => $result) {
// Store the entity id if it was found.
if (isset($result->{$id_alias}) && $result->{$id_alias} != '') {
if ($revision) {
$revision_ids_by_type[$entity_type][$index][$relationship_id] = $result->{$id_alias};
}
else {
$entity_ids_by_type[$entity_type][$index][$relationship_id] = $result->{$id_alias};
}
}
}
}
// Load all entities and assign them to the correct result row.
foreach ($entity_ids_by_type as $entity_type => $ids) {
$entity_storage = $this->entityTypeManager
->getStorage($entity_type);
$flat_ids = iterator_to_array(new \RecursiveIteratorIterator(new \RecursiveArrayIterator($ids)), FALSE);
$entities = $entity_storage->loadMultiple(array_unique($flat_ids));
$results = $this->assignEntitiesToResult($ids, $entities, $results);
}
// Now load all revisions.
foreach ($revision_ids_by_type as $entity_type => $revision_ids) {
/** @var \Drupal\Core\Entity\RevisionableStorageInterface $entity_storage */
$entity_storage = $this->entityTypeManager
->getStorage($entity_type);
$entities = [];
foreach ($revision_ids as $index => $revision_id_by_relationship) {
foreach ($revision_id_by_relationship as $revision => $revision_id) {
// Drupal core currently has no way to load multiple revisions.
$entity = $entity_storage->loadRevision($revision_id);
$entities[$revision_id] = $entity;
}
}
$results = $this->assignEntitiesToResult($revision_ids, $entities, $results);
}
}
Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.