web-dev-qa-db-ja.com

階層のある分類法で親用語を取得するにはどうすればよいですか?

「州>>郡」などの用語の階層の一部である分類用語でタグ付けされたノードがあります。

ユーザーが「county」タグの1つを選択したので、どうすれば親用語の名前を取得できますか?

5
Arosboro

自分でデータベースをクエリするか、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年に起こる可能性があります。

しかし結局のところ、どちらの方法でも問題なく機能するため、個人的な好みにすぎません。

2
googletorp

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

この関数は、階層内のすべての親用語を返します。

5
kiamlaluno