「州>>郡」などの用語の階層の一部である分類用語でタグ付けされたノードがあります。
ユーザーが「county」タグの1つを選択したので、どうすれば親用語の名前を取得できますか?
自分でデータベースをクエリするか、API関数taxonomy_get_parents
を使用できます。
複数の親がいる可能性があるため、自分でデータベースを照会する方が簡単な場合があります。
$tid = ? // the tid of the county term
$parent_tid = db_result(db_query("SELECT parent FROM {term_hierarchy} WHERE tid = %d;",
array(':tid' => $tid)
));
$parent_term = taxonomy_get_term($parent_tid);
更新-上記のクエリがDrupal 6で賢いと思う理由
一部の(kiamlaluno)は、上記の引数をDrupalのdb_query
に使用するのは間違っていると主張するでしょう6
Drupal 6では、次の3つの方法でdb_queryを使用できます。
$query = db_query($sql, $arg1, $arg2, $arg3);
$query = db_query($sql, array($arg1, $arg2, $arg3));
$query = db_query($sql, array(':arg1' => $arg1, ':arg2' => $arg2, ':arg3' => $arg3));
上記のすべてが同じものを返すので、1回以上使用しても機能的な違いはありません。なぜあなたは尋ねるかもしれません、私は最後のものを使うのが賢明だと思いますか?
Drupal 7の動作を見ると、次のことがわかります。
$query = db_query($sql, array(':arg1' => $arg1, ':arg2' => $arg2, ':arg3' => $arg3));
Drupal 7では、特別な方法でフォーマットされたクエリ引数が必要です。この例では、SQLも変更する必要があることがわかりません。 %d
のようなプレースホルダーを使用する代わりに、:arg1
のようなプレースホルダーを使用する必要があります。したがって、後者の3つのDrupal 6のdb_queryの使用方法が最も冗長ですが、Drupal 6モジュールを_にアップグレードする必要がある場合は、多くの作業を節約できます。Drupal 7.これは、あなたが何をしていたのか、またその理由を覚えていない、1年に起こる可能性があります。
しかし結局のところ、どちらの方法でも問題なく機能するため、個人的な好みにすぎません。
taxonomy_get_parents() は、引数として渡されたIDを持つ分類用語のすべての親用語を返します。
関数から返される値は、次の構造を持つ配列です:
array( 'term id' => [分類用語オブジェクト] )
分類用語オブジェクトには、「term_data」テーブルに含まれる各フィールドのプロパティが含まれています。
関数から使用されるコードは、基本的に次のコードです。
$result = db_query(db_rewrite_sql('SELECT t.tid, t.* FROM {term_data} t INNER JOIN {term_hierarchy} h ON h.parent = t.tid WHERE h.tid = %d ORDER BY weight, name', 't', 'tid'), $tid);
$parents = array();
while ($parent = db_fetch_object($result)) {
$parents[$parent->$key] = $parent;
}
ご覧のとおり、引数として渡されたものの親用語の親用語は返されません。そのためには、次のコードを実行する taxonomy_get_parents_all() が必要です。
if ($tid) {
$parents[] = taxonomy_get_term($tid);
$n = 0;
while ($parent = taxonomy_get_parents($parents[$n]->tid)) {
$parents = array_merge($parents, $parent);
$n++;
}
}
この関数は、階層内のすべての親用語を返します。