Egyszerre több entity betöltése Revision ID-k alapján?

lonalore képe

Üdv,

A kérdésem annyi lenne, hogy van-e mód arra, hogy betöltsek egyszerre több entity-t Revision ID-k alapján?

Entity ID alapján ugyebár van lehetőség betölteni több entity-t a loadMultiple() használatával, de nem találtam ilyesmit a revision-höz.

Ezek léteznek:
- load()
- loadMultiple()
- loadRevision()

...és kb ez kellene nekem:
- loadRevisionMultiple()

  1. $nodes = \Drupal::entityTypeManager()
  2. ->getStorage('node')
  3. ->loadRevisionMultiple($target_revision_ids);

Esetleg egy jól bevált módszer a loadRevisionMultiple() helyett? Foreach-be azért mégsem szeretném betenni... :)

Köszönöm!

Drupal verzió: 
szantog képe

Foreach-t ugyan nem tudod kikerülni, de ha lecseréled a node storage-t a saját classodra, abba beleírhatod:

  1. function mymodule_entity_type_alter(array &$entity_types) {
  2. /** @var $entity_types \Drupal\Core\Entity\EntityTypeInterface[] */
  3. // Set the controller class for nodes to an alternate implementation of the
  4. // Drupal\Core\Entity\EntityStorageInterface interface.
  5. $entity_types['node']->setStorageClass('Drupal\mymodule\MyCustomNodeStorage');
  6. }

  1. class MyCustomNodeStorage extends NodeStorage {
  2. function loadRevisionMultiple($target_revision_ids) {
  3. $revisions = array();
  4. foreach($target_revision_ids as $id) {
  5. $revisions[$id] = $this->loadRevision($id)
  6. }
  7.  
  8. return $revisions;
  9. }
  10. }

Így már fog működni a kódot, és tök szexi. :)

2
0

----
Rájöttem, miért kérdezek olyan ritkán a drupal.hu-n. Amíg szedem össze az infokat a kérdéshez, mindig rájövök a megoldásra.

lonalore képe

Köszönöm a gyors választ!

Igen, csak sajnos pont a foreach-et akartam kikerüli, mert ezer node-nál csak ne csináljon ezer query-t.

Közben ezt találtam: https://www.drupal.org/node/1730874

Valaki már elkezdett rajta ügyködni, de sajnos elakadt a dolog. :/ Ahogy nézem azóta már át lett variálva a drupal ezen része, olyan fájlok vannak a patch-be, amik már nem is léteznek.

Mindenesetre még megpróbálom megoldani egy custom SelectQuery-vel, majd a vissza kapott tömböt be map-elni egy-egy entity object-be, mint ahogy a mapFromStorageRecords() csinálja. Hátha.

0
0
lonalore képe

Csak összejött úgy néz ki! A hook_entity_type_alter()-rel amit ajánlottál.

.module file:

  1. /**
  2.  * Implements hook_entity_type_alter().
  3.  */
  4. function linking_entity_type_alter(array &$entity_types) {
  5. /** @var $entity_types \Drupal\Core\Entity\EntityTypeInterface[] */
  6. $entity_types['node']->setStorageClass('Drupal\linking\LinkingNodeStorage');
  7. }

Majd a custom class-em:

  1. <?php
  2.  
  3. /**
  4.  * @file
  5.  * Custom storage class for nodes.
  6.  */
  7.  
  8. namespace Drupal\linking;
  9.  
  10. use Drupal\node\NodeStorage;
  11.  
  12. /**
  13.  * Class LinkingNodeStorage.
  14.  *
  15.  * @package Drupal\linking.
  16.  */
  17. class LinkingNodeStorage extends NodeStorage {
  18.  
  19. /**
  20.   * Loads entities from the database.
  21.   *
  22.   * @param $target_revision_ids
  23.   * An array of revision ID's to load.
  24.   *
  25.   * @return array
  26.   * An array of entity objects indexed by their ids. Or empty array.
  27.   */
  28. function loadRevisionMultiple($target_revision_ids) {
  29. $revisions = [];
  30.  
  31. // Build and execute the query.
  32. $query_result = $this->revisionsBuildQuery($target_revision_ids)->execute();
  33. $records = $query_result->fetchAllAssoc($this->idKey);
  34.  
  35. if (!empty($records)) {
  36. // Convert the raw records to entity objects.
  37. $entities = $this->mapFromStorageRecords($records, TRUE);
  38. $revisions = !empty($entities) ? $entities : [];
  39. }
  40.  
  41. return $revisions;
  42. }
  43.  
  44. /**
  45.   * Builds the query to load entity revisions.
  46.   *
  47.   * Modified version of SqlContentEntityStorage::buildQuery()
  48.   * @see \Drupal\Core\Entity\Sql\SqlContentEntityStorage::buildQuery()
  49.   *
  50.   * @param array $revision_ids
  51.   * An array of revision ID's to load.
  52.   *
  53.   * @return \Drupal\Core\Database\Query\SelectInterface
  54.   * A SelectQuery object for loading the entity.
  55.   */
  56. function revisionsBuildQuery($revision_ids) {
  57. $query = $this->database->select($this->entityType->getBaseTable(), 'base');
  58.  
  59. $query->addTag($this->entityTypeId . '_load_multiple');
  60.  
  61. if ($revision_ids) {
  62. $query->join($this->revisionTable, 'revision', "revision.{$this->idKey} = base.{$this->idKey}");
  63. $query->condition("revision.{$this->revisionKey}", $revision_ids, 'IN');
  64. }
  65. elseif ($this->revisionTable) {
  66. $query->join($this->revisionTable, 'revision', "revision.{$this->revisionKey} = base.{$this->revisionKey}");
  67. }
  68.  
  69. // Add fields from the {entity} table.
  70. $table_mapping = $this->getTableMapping();
  71. $entity_fields = $table_mapping->getAllColumns($this->baseTable);
  72.  
  73. if ($this->revisionTable) {
  74. // Add all fields from the {entity_revision} table.
  75. $entity_revision_fields = $table_mapping->getAllColumns($this->revisionTable);
  76. $entity_revision_fields = array_combine($entity_revision_fields, $entity_revision_fields);
  77. // The ID field is provided by entity, so remove it.
  78. unset($entity_revision_fields[$this->idKey]);
  79.  
  80. // Remove all fields from the base table that are also fields by the same
  81. // name in the revision table.
  82. $entity_field_keys = array_flip($entity_fields);
  83. foreach ($entity_revision_fields as $name) {
  84. if (isset($entity_field_keys[$name])) {
  85. unset($entity_fields[$entity_field_keys[$name]]);
  86. }
  87. }
  88. $query->fields('revision', $entity_revision_fields);
  89.  
  90. // Compare revision ID of the base and revision table, if equal then this
  91. // is the default revision.
  92. $query->addExpression('CASE base.' . $this->revisionKey . ' WHEN revision.' . $this->revisionKey . ' THEN 1 ELSE 0 END', 'isDefaultRevision');
  93. }
  94.  
  95. $query->fields('base', $entity_fields);
  96.  
  97. return $query;
  98. }
  99.  
  100. }

Még egyszer köszi a tippet, a hook_entity_type_alter() jó ötlet volt! :)

1
0