web-dev-qa-db-ja.com

nidからノードのタイトルを取得する最も速い方法は何ですか?

私がnid(またはそれらの多く)を持っているとしましょう。タイトルを取得するためにノードをロードする方が速くなりますか、それともノードのタイトルを取得するために必要な非常に単純なdb_queryを実行するのでしょうか?

6
digitgopher

あなたが一番速く言った。

2つのことを妥協できる場合は、これが最も速いはずです。ここで、妥協する必要があることに注意してください。

  • ノードtitleのみを取得しようとしている場合で、他の_hook_node_load_実装がないことを確認している場合(基本的に、ロード時にノードの負荷を変更するモジュールハンドラー)、 node_load()またはnode_load_multiple()関数の使用をスキップして、このソリューションに進むことができます。

  • データベースからノードをロードするときは、クエリタグを使用して、ユーザーがそれらのノードにアクセスできることを確認することをお勧めします。ノードアクセスモジュールを使用しない場合は、このソリューションに進むことができます。

上記の両方の点を念頭に置いて、次のようなものを使用できます。

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

ノードIDの配列を渡すことができます。上記の関数は、_node_load_、_field_attach_、または_entity_load_のオーバーヘッドなしでタイトルを返します。また、ノードのアクセスチェックをスキップするため、何らかのアクセス制限が必要なサイトではこれを使用しないでください。

使用例:

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

与えられたすべての配列値をキーとして、タイトルをそれらの値として、配列を返します。 NULLノードが利用できない場合。

6
AyeshK

node_load_multiple を使用して、NIDのセットを持つノードを取得します。

ドキュメントページから:

この関数は、データベースから複数のノードをロードする必要がある場合は常に使用する必要があります。ノードはメモリに読み込まれ、同じページ要求中に再度読み込まれた場合、データベースアクセスは必要ありません。

4
Manikandan

これを行うより良い方法は次のとおりです。

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

そして、私はDBへの直接クエリなしでそれを行う方法があると思います。ほとんどの場合、これらの方法は完璧で、簡単で、最適化されています。

1
Iqbal

タイトルだけのノードデータ全体をロードするのはやり過ぎです。entity_load()またはnode_load()を適用する場合、フィールドテーブルからデータをレンダリングするための一連の結合が含まれるため、明らかに良いソリューションではありません。むしろ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.