it-swarm.com.de

Was ist die richtige Verwendung von EntityFieldQuery?

In Drupal 7) wird in der API-Dokumentation für node_load_multiple() angegeben, dass die Verwendung des Parameters $conditions Zugunsten der Verwendung von EntityFieldQuery veraltet ist man verwendet die Klasse, um eine Liste von Knoten-IDs zur Verwendung mit node_load_multiple() zu generieren? Gibt es andere Anwendungsfälle dafür?

37
user7

EntityFieldQuery verwendet eine Reihe von Hooks für die Schnittstelle mit Feldspeichermodulen, z. B. Field SQL Storage, um für Felder und andere Knoteneigenschaften zu arbeiten. Langfristig ist EntityFieldQuery eine viel zuverlässigere Methode zum Abfragen von Entitätstypen und kann in einigen Situationen entitätsübergreifende Abfragen durchführen (siehe field_has_data oder _ list_values_in_use () für eine Beispiel.

Hier ist ein einfaches Beispiel für die Verwendung von EntityFieldQuery, um eine Liste aller Knoten abzurufen, die vor einem bestimmten Zeitstempel veröffentlicht wurden:

$query = new EntityFieldQuery();

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

$result = $query->execute();

$ Ergebnisse aus dieser Abfrage würden ungefähr so ​​aussehen:

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

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

        )

)

Sie können dieses Array dann als Eingabe für node_load_multiple verwenden:

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

Ich habe auf Drupal ein Problem beim Hinzufügen von Beispielen für EntityFieldQuery gefunden. Ich habe es als Beispiel verwendet und meine Meinung zum Aufruf für weitere Beispiele geäußert.

" Benötigen wir ein EntityFieldQuery-Beispiel? "

Das Kommentar # 11 zeigt die Verwendung von node_load_multiple() wie unten gezeigt:

$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');
14
electblake

Hier ist ein Beispiel aus einem der Testmodule:

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

Dies wählt Knoten aus, deren Körperfeld mit "A" beginnt. Siehe auch EntityFieldQuery :: execute () zur Verwendung des zurückgegebenen Ergebnisses.

Es gibt viele Anwendungsfälle. Das typische Beispiel ist das Abfragen von Entitäten nach bestimmten Feldwerten wie dem Körperfeld, wie im ersten Beispiel gezeigt.

Der Vorteil ist, dass es unabhängig von der von Ihnen verwendeten field_storage funktioniert. Beispielsweise können Sie Ihre Felder in MongoDB haben und EntityQuery funktioniert weiterhin, während die manuelle Abfrage von field_data_body nicht funktioniert.

8
Berdir

Sie können die Klasse EntityFieldQuery verwenden, um die Datenbank abzufragen und die Ergebnisse in Form einer Liste abzurufen, die node_load_multiple() ähnelt.

Dies kann erreicht werden, indem eine Klasse erstellt, die Bedingungen angewendet und die Abfrage ausgeführt werden, zum Beispiel:

<?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();
?>

Dadurch wird das Array wie folgt generiert:

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',
    )),
  ),
)

Um die ID aus dem Ergebnisarray abzurufen, können Sie Folgendes verwenden: current(current($result))->tid.

Hier ist ein fortgeschritteneres Beispiel:

<?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);
}
?>

Weitere Informationen finden Sie unter: Verwendung von EntityFieldQuery auf Drupal.org.

0
kenorb