EntityFieldQueryの適切な使用法は何ですか?


37

Drupal 7では、パラメーターのnode_load_multiple()使用を指定するためのAPIドキュメント$conditionsは、の使用を支持して廃止されましたEntityFieldQuery。どのようにしてで使用するためのノードIDのリストを生成するクラスを使用しませんかnode_load_multiple()?他の使用例はありますか?

回答:


36

EntityFieldQueryは一連のフックを使用して、フィールドおよび他のノードプロパティを操作するために、フィールドSQLストレージなどのフィールドストレージモジュールとインターフェイスします。長期的には、EntityFieldQueryはあらゆるタイプのエンティティをクエリするためのはるかに信頼性の高い方法であり、状況によってはエンティティ間クエリを実行できます(例については、field_has_dataまたは_list_values_in_use()を参照してください

EntityFieldQueryを使用して、特定のタイムスタンプの前に発行されたすべてのノードのリストを取得する簡単な例を次に示します。

$query = new EntityFieldQuery();

$query
  ->entityCondition('entity_type', 'node', '=')
  ->propertyCondition('status', 1, '=')
  ->propertyCondition('created', '1294694496', '<');

$result = $query->execute();

そのクエリの$ resultsは次のようになります。

Array
(
    [node] => Array
        (
            [1] => stdClass Object
                (
                    [nid] => 1
                    [vid] => 49
                    [type] => article
                )

            [2] => stdClass Object
                (
                    [nid] => 2
                    [vid] => 2
                    [type] => page
                )

        )

)

次に、その配列をnode_load_multipleへの入力として使用できます。

$nodes = node_load_multiple(array_keys($result['node']));

3
field_has_dataは_list_values_in_use

15

Drupalでのサンプルの追加に関する問題を発見しましたEntityFieldQuery。私は例のためにそれを使用しているだけでなく、より多くの例のために電話で私の意見を表明しています。

EntityFieldQueryの例が必要ですか?

コメント#11のショーの使用状況node_load_multiple()下に見られるように:

$query = new EntityFieldQuery();
$entities = $query->entityCondition('entity_type', 'node')
                        ->entityCondition('bundle', 'event')
                        ->propertyCondition('status', 1)
                        ->fieldCondition('field_date', 'value', array('2011-03-01', '2011-03-31'), 'BETWEEN')
                        ->fieldOrderBy('field_date', 'value', 'ASC')
                        ->execute();

$nodes = entity_load('node', array_keys($entities['node']));
return node_view_multiple($nodes, 'teaser');

2
注意、fieldOrderByメソッドは、関連フィールドが空のノードを除外します。紛らわしいのは、これはソートではなく、フィルターではないことになっています(空のフィールドを持つノードは結果セットの一番上または一番下にあるはずです)。詳細情報と、うまくいけば修正がここで見つけることができdrupal.org/node/1611438、ここdrupal.org/node/1662942
マリオアワド

9

テストモジュールの1つからの例を次に示します。

http://api.drupal.org/api/drupal/modules--node--tests--node_access_test.module/function/node_access_entity_test_page/7

これは、ボディフィールドが「A」で始まるノードを選択します。返された結果の使用方法については、EntityFieldQuery :: execute()もご覧ください。

多くの使用例がありますが、典型的な例は、最初の例に示されているように、bodyフィールドのような特定のフィールド値についてエンティティをクエリすることです。

利点は、使用しているfield_storageに関係なく機能することです。たとえば、MongoDBでフィールドを使用できますが、手動でfield_data_bodyをクエリしても、EntityQueryは機能します。


0

EntityFieldQueryクラスを使用して、データベースにクエリを実行し、のようなリストの形式で結果を取得できますnode_load_multiple()

これは、クラスを作成し、条件を適用し、クエリを実行することで実現できます。例:

<?php
$query = new EntityFieldQuery();
$query
  ->entityCondition('entity_type', 'TYPE') // E.g. node, entityform, taxonomy_term
  ->entityCondition('bundle', 'BUNDLE')
  ->fieldCondition('field_foo', 'value', 'STRING')
  ->range(0,10);
$result = $query->execute();
?>

これにより、次のような配列が生成されます。

array (
  'TYPE' =>
  array (
    123 =>
    stdClass::__set_state(array(
       'nid' => '123', // Can be also tid when loading terms.
       'key' => 'value',
    )),
    456 =>
    stdClass::__set_state(array(
       'nid' => '456',
       'key' => 'value',
    )),
  ),
)

結果配列からIDを取得するには、次を使用できますcurrent(current($result))->tid

より高度な例を次に示します。

<?php
$query = new EntityFieldQuery();

$query->entityCondition('entity_type', 'node')
  ->entityCondition('bundle', 'article')
  ->propertyCondition('status', NODE_PUBLISHED)
  ->fieldCondition('field_news_types', 'value', 'spotlight', '=')
  ->fieldCondition('field_photo', 'fid', 'NULL', '!=')
  ->fieldCondition('field_faculty_tag', 'tid', $value)
  ->fieldCondition('field_news_publishdate', 'value', $year . '%', 'like')
  ->fieldOrderBy('field_photo', 'fid', 'DESC')
  ->range(0, 10)
  ->addMetaData('account', user_load(1)); // Run the query as user 1.

$result = $query->execute();

if (isset($result['node'])) {
  $news_items_nids = array_keys($result['node']);
  $news_items = entity_load('node', $news_items_nids);
}
?>

詳細については、Drupal.orgでEntityFieldQuery を使用する方法を参照してください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.