If you’re coming from Drupal 7, you’ll remember how simple it was to load a node:
$nid = 123;
$node = node_load($nid);
In modern Drupal (8, 9, 10, 11 and beyond) things have changed. We have several ways to do it, each with its own advantages.
The quick way (similar to Drupal 7)
If you’re looking for something similar to what you used to do:
use Drupal\node\Entity\Node;
$nid = 123;
$node = Node::load($nid);
This is the most concise option and perfectly valid for scripts, hooks or quick code.
The recommended way (dependency injection)
In services, controllers or plugins, the proper approach is to inject the EntityTypeManager:
use Drupal\Core\Entity\EntityTypeManagerInterface;
use Drupal\node\NodeInterface;
class MyService {
public function __construct(
protected EntityTypeManagerInterface $entityTypeManager,
) {}
public function loadNode(int $nid): ?NodeInterface {
return $this->entityTypeManager->getStorage('node')->load($nid);
}
}
Why? Because it makes the code testable, decoupled and follows Drupal standards.
Loading multiple nodes
To load several nodes at once, use loadMultiple():
use Drupal\node\Entity\Node;
$nids = [1, 2, 3, 45, 67];
$nodes = Node::loadMultiple($nids);
foreach ($nodes as $node) {
// Work with each node
}
Finding nodes by field (EntityQuery)
If you need to search for nodes by some criteria before loading them:
$nids = \Drupal::entityQuery('node')
->condition('type', 'article')
->condition('status', 1)
->condition('field_category', 'technology')
->accessCheck(TRUE)
->execute();
$nodes = Node::loadMultiple($nids);
Important: Since Drupal 9.2, accessCheck() is mandatory. If you don’t include it, you’ll see a deprecation notice.
Quick reference
| Situation | Recommended method |
|---|---|
| Quick script or hook | Node::load($nid) |
| Service or controller | Inject EntityTypeManager |
| Load multiple nodes | Node::loadMultiple($nids) |
| Search by criteria | entityQuery() + loadMultiple() |
Bonus: accessing node fields
Once the node is loaded:
// Get the title
$title = $node->getTitle();
// Get a field value
$value = $node->get('field_my_field')->value;
// Get entity reference (e.g.: image, term)
$media = $node->get('field_image')->entity;
// Check if field has a value
if (!$node->get('field_my_field')->isEmpty()) {
// ...
}
The code has changed compared to Drupal 7, but once you get used to it, the entity system is much more powerful and consistent.