私がnid(またはそれらの多く)を持っているとしましょう。タイトルを取得するためにノードをロードする方が速くなりますか、それともノードのタイトルを取得するために必要な非常に単純なdb_queryを実行するのでしょうか?
あなたが一番速く言った。
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
ノードが利用できない場合。
node_load_multiple を使用して、NIDのセットを持つノードを取得します。
ドキュメントページから:
この関数は、データベースから複数のノードをロードする必要がある場合は常に使用する必要があります。ノードはメモリに読み込まれ、同じページ要求中に再度読み込まれた場合、データベースアクセスは必要ありません。
これを行うより良い方法は次のとおりです。
<?php
$node_title = node_load($nid)->title;
?>
そして、私はDBへの直接クエリなしでそれを行う方法があると思います。ほとんどの場合、これらの方法は完璧で、簡単で、最適化されています。
タイトルだけのノードデータ全体をロードするのはやり過ぎです。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)))
を適用することをお勧めします