it-swarm.com.de

Was ist der schnellste Weg, um den Knotentitel von nid zu erhalten?

Angenommen, ich habe eine NID (oder viele von ihnen). Wäre es schneller, den Knoten zu laden, um auf den Titel zuzugreifen, oder würde die sehr einfache db_query ausgeführt, um den Knotentitel abzurufen?

6
digitgopher

Du hast am schnellsten gesagt.

Wenn Sie zwei Dinge kompromittieren können, sollte dies die schnellste sein. Beachten Sie nun, dass Sie Kompromisse eingehen müssen:

  • Wenn Sie nur versuchen, den Knoten title abzurufen, und wenn Sie sicher sind, dass es keine anderen hook_node_load - Implementierungen gibt (im Grunde Modulhandler, die die Knotenlast zum Zeitpunkt des Ladens ändern würden) können Sie mit den Funktionen node_load() oder node_load_multiple() überspringen und diese Lösung wählen.

  • Beim Laden eines Knotens aus der Datenbank wird empfohlen, ein Abfrage-Tag zu verwenden, um sicherzustellen, dass der Benutzer Zugriff auf diese Knoten hat. Wenn Sie keine Knotenzugriffsmodule verwenden, können Sie sich für diese Lösung entscheiden.

In Anbetracht der beiden oben genannten Punkte können Sie Folgendes verwenden:

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;
}

Sie können ein Array von Knoten-IDs übergeben, und die obige Funktion gibt ihre Titel ohne den Overhead von node_load, field_attach Oder entity_load Zurück. Außerdem werden Knotenzugriffsprüfungen übersprungen. Verwenden Sie diese Option daher nicht für Websites, für die Zugriffsbeschränkungen erforderlich sind.

Anwendungsbeispiel:

 $titles = MYMODULE_node_get_title_fast(array(256, 258, 54898));

Sie würden ein Array mit allen angegebenen Array-Werten als Schlüssel und dem Titel als Wert zurückgeben. NULL wenn der Knoten nicht verfügbar ist.

6
AyeshK

Verwenden Sie node_load_multiple , um Knoten mit Ihren Nids zu erhalten.

Von der Dokumentationsseite:

Diese Funktion sollte immer dann verwendet werden, wenn Sie mehr als einen Knoten aus der Datenbank laden müssen. Knoten werden in den Speicher geladen und erfordern keinen Datenbankzugriff, wenn sie während derselben Seitenanforderung erneut geladen werden.

4
Manikandan

der bessere Weg, dies zu tun, ist:

      <?php
         $node_title = node_load($nid)->title;
    ?>

und ich denke, wenn es eine Möglichkeit gibt, dies ohne direkte Abfrage an die Datenbank zu tun. Dann müssen Sie diesen Weg gehen. In den meisten Fällen sind diese Wege perfekt, einfach und optimiert.

1
Iqbal

Das Laden ganzer Knotendaten nur für einen Titel ist übertrieben. Wenn Sie entity_load () oder node_load () anwenden, sind mehrere Verknüpfungen erforderlich, um die Daten aus Feldtabellen zu rendern. Dies ist offensichtlich keine gute Lösung. Ich würde eher vorschlagen, db_query("SELECT title from {node} where nid = :nid and status and status = :status" , array(':nid' => <Your nid>, ':status' => 1 ( //for published nodes))) anzuwenden

1
Shabir A.