it-swarm-ja.com

Entityfieldqueryを使用してフィールドコレクションの値を抽出する方法

'field_group'という名前のフィールドコレクションがあるコンテンツタイプ 'customer'を作成しました。フィールドコレクションには、次の2つのフィールドがあります。

  1. 題名
  2. 名前

顧客コンテンツタイプとグループフィールドコレクションはエンティティタイプ「ノード」であり、グループ内の2つのフィールドはエンティティタイプ「フィールド_コレクション_アイテム」です。この特定のコンテンツタイプのグループ内のフィールドの値を取得するために、データベースをクエリしたいと思います。グループのフィールド値を取得するために、次のクエリを使用しました。

    $query = new EntityFieldQuery();

    $query->entityCondition('entity_type', 'field_collection_item')
          ->entityCondition('bundle', 'field_group');

    $result = $query->execute();

$nodes = entity_load('field_collection_item', array_keys($result['field_collection_item'])); 

ただし、上記のentityfieldqueryはエンティティタイプfield_collection_itemのすべての値を取得します。ただし、コンテンツタイプ「顧客」の値のみが必要です。上記のクエリの何が問題になっているのか誰にも教えてもらえますか?

7

EntityFieldQueryは1種類のエンティティのみを参照でき、エンティティ間の関係を表すことはできません。 entity_typeクエリの_はfield_collection_item、それがクエリが返すエンティティのタイプです。 EntityFieldQueryには、フィールドコレクションがノードに関連しているという事実や、その他のことには何の概念もありません。

フィールドコレクションに関連するエンティティを取得するには、別のEntityFieldQueryを実行する必要があります。これまでフィールドコレクションを使用したことはありませんが、ロジックは次のようになると思います。

$query = new EntityFieldQuery;
$query->entityCondition('entity_type', 'node')
  ->entityCondition('bundle', 'customer')
  ->fieldCondition('field_name_of_collection_field', 'name_of_field_collection_column', array_keys($result['field_collection_item']));

そのコード(フィールドコレクションフィールドの名前、フィールドコレクションリレーションシップの列名)で変更する必要があるものがありますが、それで始められるはずです。

2クエリアプローチの実際の例:

function get_species_country($id_country) {
    $inner = new EntityFieldQuery();
    $inner_r = $inner->entityCondition('entity_type', 'field_collection_item')
                     ->fieldCondition('field_species_country', 'target_id', $id_country, '=')
                     ->execute();
    if(!empty($inner_r['field_collection_item'])) {
        $keys = array_keys($inner_r['field_collection_item']);
        $query = new EntityFieldQuery();
        $species_r = $query->entityCondition('entity_type', 'node')
                      ->entityCondition('bundle', self::$bundle)
                      ->fieldCondition('field_species_countries', 'value', $keys)
                      ->execute();
        if(!empty($species_r['node'])) {
            $ret = node_load_multiple(array_keys($species_r['node']));
        }
    }
    return $ret;
}

上記の例では:

  • field_species_countries-フィールドコレクションの名前
  • field_species_country-フィールドコレクション内の実際のフィールド

制限:2番目のクエリには... WHEREfieldIN(1、2、3 ...)。 MySQLの場合、これはmax_allowed_pa​​cketによって制限されます

11
Clive

フィールドが関連しているはずであることをEFQに知らせるために、delta_groupパラメーターを使用する必要があると思います。 fieldConditionのドキュメントこのコメント に適切な説明があります。

$ delta_groupパラメーターを使用すると、条件をグループ化できます。私は常にドキュメントを読んで、フィールド自体にデルタを指定していたことを意味しますが、そうではありません。

たとえば、同じフィールドの2つの列に基づいてエンティティを選択する場合は、デルタグループを使用して、条件が依存していることを確認します。

0
beth