web-dev-qa-db-fra.com

Quel est le moyen le plus rapide pour obtenir le titre d'un nœud à partir de nid?

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?

6
digitgopher

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.

6
AyeshK

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.

4
Manikandan

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.

1
Iqbal

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)))

1
Shabir A.