Qual è l'uso corretto di EntityFieldQuery?


37

In Drupal 7, la documentazione API per node_load_multiple()specificare l'utilizzo del $conditionsparametro è stata deprecata a favore dell'utilizzo EntityFieldQuery. Come si usa la classe per generare un elenco di ID nodo da utilizzare con node_load_multiple()? Ci sono altri casi d'uso per questo?

Risposte:


36

EntityFieldQuery utilizza una serie di hook per interfacciarsi con i moduli di archiviazione dei campi, come Archiviazione Field SQL, per lavorare con i campi e con altre proprietà dei nodi. A lungo termine, EntityFieldQuery è un modo molto più affidabile per eseguire query su qualsiasi tipo di entità e in alcune situazioni può eseguire query tra entità (vedere field_has_data o _list_values_in_use () per un esempio.

Ecco un semplice esempio dell'utilizzo di EntityFieldQuery per ottenere un elenco di tutti i nodi pubblicati prima di un timestamp specifico:

$query = new EntityFieldQuery();

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

$result = $query->execute();

$ risultati da quella query sarebbe simile a questo:

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

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

        )

)

È quindi possibile utilizzare tale array come input per node_load_multiple:

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

3
field_has_data è un esempio migliore di _list_values_in_use

15

Ho trovato un problema su Drupal sull'aggiunta di esempi per EntityFieldQuery. L'ho usato per esempi e per esprimere la mia opinione sulla chiamata per ulteriori esempi.

" Abbiamo bisogno di un esempio EntityFieldQuery? "

Il commento n. 11 mostra l'utilizzo di node_load_multiple()come visto di seguito:

$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
Attenzione, il metodo fieldOrderBy tralascerà tutti i nodi che hanno il campo relativo vuoto. Il che è confuso perché questo dovrebbe solo ordinare e non filtrare (ci si aspetterebbe che i nodi con il campo vuoto siano in cima o in fondo al set di risultati). Maggiori informazioni e, si spera, una soluzione può essere trovata qui drupal.org/node/1611438 e qui drupal.org/node/1662942
Mario Awad,

9

Ecco un esempio da uno dei moduli di test:

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

Seleziona i nodi il cui campo body inizia con "A". Vedi anche EntityFieldQuery :: execute () su come utilizzare il risultato restituito.

Esistono molti casi d'uso, l'esempio tipico è la query di entità per valori di campo specifici come il campo body, come mostrato nel primo esempio.

Il vantaggio è che funziona indipendentemente da field_storage che stai utilizzando. Ad esempio, puoi avere i tuoi campi in MongoDB e EntityQuery continuerà a funzionare mentre le query field_data_body non funzionerebbero manualmente.


0

È possibile utilizzare la classe EntityFieldQuery per eseguire una query sul database e recuperare i risultati in forma di elenco simile a node_load_multiple().

Ciò può essere ottenuto creando una classe, applicando le condizioni ed eseguendo la query, ad esempio:

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

Questo genererà l'array come:

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

Per recuperare l'ID dall'array dei risultati, è possibile utilizzare: current(current($result))->tid .

Ecco un esempio più avanzato:

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

Vedi: Come usare EntityFieldQuery su Drupal.org per ulteriori spiegazioni.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.