Was ist die richtige Verwendung von EntityFieldQuery?

37

In Drupal 7 wurde die API-Dokumentation für die node_load_multiple()Angabe der Verwendung des $conditionsParameters zugunsten der Verwendung verworfen EntityFieldQuery. Wie verwendet man die Klasse, um eine Liste von Knoten-IDs zur Verwendung mit zu generieren node_load_multiple()? Gibt es noch andere Anwendungsfälle dafür?

Andre Baumeier
quelle

Antworten:

36

EntityFieldQuery verwendet eine Reihe von Hooks für die Schnittstelle zu 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 eines beliebigen Entitätstyps. In einigen Situationen kann es auch entitätsübergreifende Abfragen durchführen ( ein Beispiel finden Sie unter field_has_data oder _list_values_in_use () .

Hier ist ein einfaches Beispiel für die Verwendung von EntityFieldQuery, um eine Liste aller Knoten zu erhalten, 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();

$ Die Ergebnisse dieser Abfrage sehen ungefähr so ​​aus:

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']));
Mikey P
quelle
3
field_has_data ist ein besseres Beispiel als _list_values_in_use
15

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

" Brauchen wir ein EntityFieldQuery-Beispiel? "

Der Kommentar # 11 zeigt die Verwendung von node_load_multiple()wie folgt:

$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');
electblake
quelle
2
Achtung, die Methode fieldOrderBy lässt alle Knoten aus, bei denen das zugehörige Feld leer ist. Dies ist verwirrend, da hier nur sortiert und nicht gefiltert werden soll (es ist zu erwarten, dass sich Knoten mit leerem Feld oben oder unten in der Ergebnismenge befinden). Weitere Informationen und hoffentlich eine Lösung finden Sie hier drupal.org/node/1611438 und hier drupal.org/node/1662942
Mario Awad
9

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

Hiermit werden Knoten ausgewählt, deren Body-Feld mit "A" beginnt. Siehe auch EntityFieldQuery :: execute () zur Verwendung des zurückgegebenen Ergebnisses.

Es gibt viele Anwendungsfälle. Das typische Beispiel ist die Abfrage von Entitäten nach einem bestimmten Feldwert, wie z. B. dem Body-Feld (siehe erstes Beispiel).

Der Vorteil ist, dass es funktioniert, egal welchen field_storage Sie verwenden. Beispielsweise können Sie Ihre Felder in MongoDB haben und EntityQuery funktioniert weiterhin, während die manuelle Abfrage von field_data_body nicht funktioniert.

Berdir
quelle
0

Mit der EntityFieldQuery- Klasse können Sie die Datenbank abfragen und die Ergebnisse in einer Liste abrufen , die der ähnelt node_load_multiple().

Dies kann erreicht werden, indem eine Klasse erstellt, die Bedingungen angewendet und die Abfrage ausgeführt wird. 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 Ergebnis Array zu holen, können Sie verwenden: current(current($result))->tid.

Hier ist ein erweitertes 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.

Kenorb
quelle