Disons que j'ai un nid (ou beaucoup d'entre eux). Serait-il plus rapide de charger le nœud pour accéder à obtenir le titre, ou faire la très simple db_query requise pour obtenir le titre du nœud?
Tu as dit le plus vite.
Si vous pouvez compromettre deux choses, cela devrait être le plus rapide. Maintenant, notez que vous devez faire des compromis:
Si vous essayez uniquement d'obtenir le nœud title
et si vous êtes sûr qu'il n'y a pas d'autres implémentations hook_node_load
(Essentiellement des gestionnaires de modules qui modifieraient la charge du nœud au moment de leur chargement) , vous pouvez ignorer l'utilisation des fonctions node_load()
ou node_load_multiple()
et opter pour cette solution.
Lors du chargement d'un nœud à partir de la base de données, il est conseillé d'utiliser une balise de requête pour vous assurer que l'utilisateur a accès à ces nœuds. Si vous n'utilisez aucun module d'accès aux nœuds, vous pouvez choisir cette solution.
Avec les deux points ci-dessus à l'esprit, vous pouvez utiliser quelque chose comme ceci:
function MYMODULE_node_get_title_fast(array $nids) {
$titles = &drupal_static(__FUNCTION__, array());
$return = array();
$unavailable = array();
foreach ($nids as $nid) {
// Lookup static cache of self.
if (array_key_exists($nid, $titles)) {
$return[$nid] = $titles[$nid];
}
else { // Set NULL, so unavailable nodes will have NULL as their return value.
$unavailable[$nid] = NULL;
}
}
if ($unavailable) {
$results = db_query("SELECT nid, title FROM {node} WHERE nid IN (:nids)", array(':nids' => array_keys($unavailable)))->fetchAllKeyed(0, 1);
if ($results) {
$return = $results + $unavailable;
$titles = $return + $titles;
}
}
return $return;
}
Vous pouvez transmettre un tableau d'ID de nœud, et la fonction ci-dessus renverra leurs titres sans les frais généraux de node_load
, field_attach
Ou entity_load
Frais généraux. Il ignore également les vérifications d'accès aux nœuds, donc ne l'utilisez pas dans les sites pour lesquels vous souhaitez des restrictions d'accès.
Exemple d'utilisation:
$titles = MYMODULE_node_get_title_fast(array(256, 258, 54898));
Vous renverriez un tableau, avec toutes les valeurs de tableau données comme clés et le titre comme valeur. NULL
si le noeud n'est pas disponible.
Utilisez node_load_multiple pour obtenir des nœuds avec votre ensemble de nids.
Depuis la page de documentation:
Cette fonction doit être utilisée chaque fois que vous devez charger plus d'un nœud à partir de la base de données. Les nœuds sont chargés en mémoire et ne nécessiteront pas d'accès à la base de données s'ils sont à nouveau chargés lors de la même demande de page.
la meilleure façon de le faire est:
<?php
$node_title = node_load($nid)->title;
?>
et je pense que s'il existe un moyen de le faire sans requête directe à DB. alors vous devez aller dans ce sens. Dans la plupart des cas, ces moyens sont parfaits, faciles et optimisés.
Charger des données de nœuds entières pour un seul titre est exagéré, si vous appliquez entity_load () ou node_load (), cela impliquait un tas de jointures pour rendre les données des tables de champs, ce qui n'est évidemment pas une bonne solution. Je préfère suggérer d'appliquer db_query("SELECT title from {node} where nid = :nid and status and status = :status" , array(':nid' => <Your nid>, ':status' => 1 ( //for published nodes)))