web-dev-qa-db-ja.com

フィールド値によって分類用語(またはエンティティ)をロードする方法は?

分類用語をプログラムで読み込むには、EntityFieldQueryを使用できます。

_<?php

// Get taxonomy term by field value
$section_vocab = taxonomy_vocabulary_machine_name_load('section');

if($section_vocab) {
  $query = new EntityFieldQuery();
  $query->entityCondition('entity_type', 'taxonomy_term')
    ->propertyCondition('vid', $section_vocab->vid);
  $result = $query->execute();

  ...

}
_

ただし、分類用語のフィールドは読み込まれません。結果は常に空であるため、query$query->fieldCondition('field_id', 'value', '123');にフィールド条件を追加しても機能しません。

悪い解決策

したがって、ここで見つけたEntityFieldQueryを使用したソリューション https://www.drupal.org/node/1517744 は機能しますが、(最悪の場合)ボキャブラリのすべての用語をループする必要があります高コスト。

_<?php

// Get taxonomy term by field value
$section_vocab = taxonomy_vocabulary_machine_name_load('section');

$sectionID = NULL;

if($section_vocab) {
  $query = new EntityFieldQuery();
  $query->entityCondition('entity_type', 'taxonomy_term')
    ->propertyCondition('vid', $section_vocab->vid)
  $result = $query->execute();

  if (!empty($result['taxonomy_term'])) {
    // To load all terms.
    $terms = taxonomy_term_load_multiple(array_keys($result['taxonomy_term']));

    // Look up for the first term with the field value that we want.
    foreach ($terms as $term) {
      // Stop looking if we find it
      $value = $term->field_id['und'][0]['value'];
      if ($value == $IDtoFind){
        $termID = $term->tid;
        break;
      }
    }

  }
}
_

分類用語にマシン_field_id_のフィールドがある場合、分類用語に特定の値をどのようにロードできますか?

1
Miguelos

EntityFieldQuery のドキュメントで指定されています。複数のエンティティタイプに対してクエリを実行することはできません。 _vocabulary->vid_と_field_id->value_の両方をクエリする必要があるため、特定のフィールド値ですべての用語をクエリすることはできません。

フィールド値によって分類用語をロードするには、その値を持つすべてのエンティティを取得できます。

_  $query->entityCondition('entity_type', 'taxonomy_term')
    ->fieldCondition('field_id', 'value', $IDtoFind, '=');
_

同じクエリで->fieldCondition('field_id', 'value', $IDtoFind, '=')->propertyCondition('vid', $section_vocab->vid)を使用すると、空の結果が生成されます。

解決

質問のコードではこれは機能しますが、_field_id_は1つの語彙のみが使用され、その値は一意です。

_<?php
// Get taxonomy term by field value
$section_vocab = taxonomy_vocabulary_machine_name_load('section');

$sectionID = NULL;

if($section_vocab) {
  $query = new EntityFieldQuery();
  $query->entityCondition('entity_type', 'taxonomy_term')
    ->fieldCondition('field_id', 'value', $IDtoFind, '=');
  $result = $query->execute();

  if (!empty($result['taxonomy_term'])) {
    // Set the internal pointer of an array to its first element
    reset($result['taxonomy_term']);
    // Get the key value for the first item
    $termID = key($result['taxonomy_term']);

  }
}
_
2
Miguelos

https://api.drupal.org/api/drupal/modules%21taxonomy%21taxonomy.module/function/taxonomy_get_tree/7 を使用する必要があります

あなたのケースでは、「load_entities」をTRUEに設定する必要があります

taxonomy_get_tree($vid, $parent = 0, $max_depth = NULL, $load_entities = FALSE);
1
Robin