Jakie jest właściwe zastosowanie EntityFieldQuery?

37

W Drupal 7 dokumentacja API dla node_load_multiple()określania używania $conditionsparametru została wycofana na korzyść użycia EntityFieldQuery. Jak wykorzystać klasę do wygenerowania listy identyfikatorów węzłów do użycia node_load_multiple()? Czy istnieją inne przypadki użycia?

Andre Baumeier
źródło

Odpowiedzi:

36

EntityFieldQuery używa zestawu haków do łączenia się z modułami pamięci pól, takimi jak Pamięć pól SQL, w celu pracy z polami, a także innymi właściwościami węzłów. W dłuższej perspektywie EntityFieldQuery jest znacznie bardziej niezawodnym sposobem na zapytanie dowolnego typu encji, aw niektórych sytuacjach może wykonywać zapytania między eniami ( na przykład patrz field_has_data lub _list_values_in_use ()) .

Oto prosty przykład użycia EntityFieldQuery do uzyskania listy wszystkich węzłów opublikowanych przed określonym znacznikiem czasu:

$query = new EntityFieldQuery();

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

$result = $query->execute();

Wyniki $ $ z tego zapytania wyglądałyby mniej więcej tak:

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

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

        )

)

Następnie możesz użyć tej tablicy jako danych wejściowych do wielu_węzła_węzła:

$nodes = node_load_multiple(array_keys($result['node']));
Mikey P.
źródło
3
field_has_data jest ładniejszym przykładem imo niż _list_values_in_use
15

Znalazłem problem na Drupal dotyczący dodawania przykładów dla EntityFieldQuery. Używałem go do przykładów, a także do wyrażania opinii na temat zaproszenia do kolejnych przykładów.

Czy potrzebujemy przykładu EntityFieldQuery?

Komentarz # 11 Wykorzystanie pokazy node_load_multiple(), jak widać poniżej:

$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
źródło
2
Uwaga, metoda fieldOrderBy pominie wszystkie węzły, w których powiązane pole jest puste. Co jest mylące, ponieważ ma to jedynie na celu sortowanie, a nie filtrowanie (można oczekiwać, że węzły z pustym polem będą na górze lub na dole zestawu wyników). Więcej informacji i mam nadzieję, że poprawkę można znaleźć tutaj drupal.org/node/1611438 i tutaj drupal.org/node/1662942
Mario Awad
9

Oto przykład z jednego z modułów testowych:

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

To wybiera węzły, których pole treści zaczyna się od „A”. Zobacz także EntityFieldQuery :: execute () na temat korzystania ze zwróconego wyniku.

Istnieje wiele przypadków użycia, typowym przykładem jest zapytanie jednostek o określoną wartość pola, np. Pole treści, jak pokazano w pierwszym przykładzie.

Zaletą jest to, że działa bez względu na to, jakiego miejsca przechowywania używasz. Na przykład możesz mieć swoje pola w MongoDB, a EntityQuery będzie nadal działać, podczas gdy ręczne sprawdzanie danych pola_danych_body nie.

Berdir
źródło
0

Za pomocą klasy EntityFieldQuery można wyszukiwać w bazie danych i pobierać wyniki w postaci listy podobnej do node_load_multiple().

Można to osiągnąć poprzez utworzenie klasy, zastosowanie warunków i wykonanie zapytania, na przykład:

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

Spowoduje to wygenerowanie tablicy, takiej jak:

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

Aby pobrać identyfikator z tablicy wyników, można użyć: current(current($result))->tid.

Oto bardziej zaawansowany przykład:

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

Zobacz: Jak korzystać z EntityFieldQuery na Drupal.org, aby uzyskać więcej wyjaśnień.

kenorb
źródło