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


7

'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のすべての値を取得します。ただし、コンテンツタイプ「顧客」の値のみが必要です。上記のクエリの何が問題になっているのか教えてもらえますか?

回答:


11

EntityFieldQuery唯一のエンティティの一つのタイプを参照することができ、それはエンティティ間のすべての関係を表現することはできません。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番目のクエリには... WHERE フィールド IN(1、2、3 ...)が含まれているため、これにはいくつかの制限があると思います。MySQLの場合、これはmax_allowed_pa​​cketによって制限されます


私はこれを試して、あなたに知らせます。乾杯メイト。
Drupal開発者

1
これはとても役に立ちました、ありがとう!頭を一周するのに少し時間がかかったので、重要な部分を強調する価値があるかもしれません。2番目を実行する必要が EntityFieldQueryあります。これは、関連するフィールドコレクションアイテムのEntityIdsを返し、メインクエリのfieldConditionメソッドにプラグインされます。
aendrew

0

delta_groupパラメーターを使用して、フィールドが関連していると思われることをEFQに知らせたいと思います。このfieldConditionドキュメントのコメント、良い説明があります

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

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


反対投票者になるのは嫌いですが、私が知る限り、これは真実ではありません-Cliveが言ったように、EntityFieldQueryには2つのバンドルが関連しているという概念がありません。これらは基本的に2つの別個のエンティティタイプとして機能します。とはいえ、delta_groupsを使用して概念実証を行うことができれば、喜んでダウン投票を解除します。
aendrew

aendrew、私はこのコード例で何が起こっているのか誤解しているのですか、それとも質問を誤解しているのですか?drupal.org/node/916776#comment-4011564
ベス

私は問題だと思います-デルタグループは単に条件を結合します(ifステートメントに括弧を追加するのと同じように)。質問が求めているのは、基本的に1つのエンティティタイプをクエリし、その結果を2番目のクエリの条件として使用することです。問題のフィールドは、独自のフィールドを持つ個別のエンティティタイプであるフィールドコレクションです(フィールドコレクションを使用したことがないかどうかを説明するのは少し難しいですが、かなりクールなモジュールであり、そうでない場合はチェックする価値があります) )。
aendrew
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.