Get tag(term) name for multiple nodes without a performance hit I want to get a list of nodes and return them as JSON along with their tags (names included). After a lot of research, I've only come up with this solution:

I have an array of Nodes (\Drupal\Core\Entity\EntityInterface) loaded with Node::loadMultiple().

Iterating over the array of nodes, and getting their tags using $node-&gt;field_tags (or whatever the machine name of the tags is) which yields an array of \Drupal\Core\Field\Plugin\Field\FieldType\EntityReferenceItem

Getting all the terms of the node using Term::loadMultiple() and then iterating over them and getting the name using $term-&gt;name[0]-&gt;value.

The problem is that there's an extra database read for every node, and I guess that the underlying query for this read is a JOIN :|.

Question: Is there an efficient way to load the tag (term) names along with target_id, target_type, target_uuid, etc? If no, is the current loop on each node the way to go???

More Info:


I'm paginating the results
The client can set the number of results per page, but there's a 50 nodes per page limit


Thanks

P.S.: I have two more types of tags so I have to do this two more times. Bright side is, the other two tags are 1to1.
If you're already looping over an array of nodes, have you considered collecting the term IDs before loading them in one query? That should save a lot of the overhead of running multiple queries:

$map = [];
$tids = [];

// Collect IDs for each node:
/** @var \Drupal\node\Entity\NodeInterface[] $nodes */
foreach ($nodes as $nid =&gt; $node) {
  /** @var \Drupal\Core\Field\Plugin\Field\FieldType\EntityReferenceItem $item */
  foreach ($node-&gt;field_tags as $item) {
    $tid = $item-&gt;target_id;
    $map[$nid][$tid] = $tid;
    $tids[$tid] = $tid;
  }
}

// Load terms and collect their labels:
$term_labels = [];
/** @var \Drupal\taxonomy\Entity\TermInterface $term */
foreach (Term::loadMultiple($tids) as $tid =&gt; $term) {
  $term_labels[$tid] = $term-&gt;label();
}

// Assign the term labels to each node.
foreach ($map as $nid =&gt; $node_tids) {
  foreach ($node_tids as $tid) {
    $map[$nid][$tid] = $term_labels[$tid];
  }
}