Ottieni solo alcuni campi con EntityFieldQuery?


19

Drupal 7 ha un sistema di query ORM molto promettente con EntityFieldQuery.

Attualmente capisco come effettuare la selezione di nodi, ma il risultato non contiene alcuna informazione specifica, come fileds, che sto cercando.

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

Pertanto, se vogliamo ottenere solo i valori di un campo, ad esempio "field_date" nell'esempio corrente, dobbiamo caricare interi dati di nodi.

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

Se c'è un modo per ottenere il valore dei campi, invece di caricare i dati completi di tutti i nodi, poiché provoca un sovraccarico di memoria.

$nodesFieldDates = ???

Risposte:


10

Ottima domanda!

EntityFieldQuery è roba davvero buona, ma se vuoi davvero diventare serio, devi sovrascrivere la classe in un modulo personalizzato e aggiungere qualsiasi comportamento tu abbia bisogno di fare lì.

Non conosco le tue intenzioni esatte, ma in passato mi sono riferito a questo articolo sull'argomento. Ringraziamo Neil Hastings per questo scritto ben scritto.

Cerca esempi di codice un po 'nell'articolo per buoni esempi di overiding.

Spero che ti aiuti, buona programmazione!


Ok capisco ! Quindi, probabilmente, è possibile ridefinire il metodo "EntityFieldQuery" "buildQuery", per alternare i campi risultanti. Probabilmente, questo potrebbe funzionare.
Fedir RYKHTIK il

11

Ho trovato la risposta per questo! Il modulo Apache Solr estende la classe EntityFieldQuery per farlo accadere. Aggiunge un nuovo metodo chiamato addExtraField.

<?php
$query = new ApachesolrAttachmentsEntityFieldQuery();
$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')
  ->addExtraField('field_date', 'value', 'value')
  ->execute();
?>

Se non hai installato Apache Solr, copia semplicemente il codice per estendere quella classe.


Creato una sandbox per questo dato che il modulo Apache Solr presentava alcuni svantaggi drupal.org/sandbox/mikeytown2/2209909
mikeytown2

2
Questa risposta è stata semplicemente votata per il modulo (attualmente sandbox) creato da mikeytown2 (grazie!)
Oliver Coleman il

Il link nella risposta non sembra funzionare. Dice "Devi accedere o iscriverti prima di continuare".
mbomb007,



0

Chiunque desideri ancora ottenere Fields da un EFQ dà un'occhiata al modulo EFQ Extra Fields .

Avvertenza: questo modulo abusa di EntityFieldQuery per restituire dati dal database. Non funziona con entità o moduli che si basano su di esse.

Consente di utilizzare addField all'interno di un oggetto EntityFieldQueryExtraFields (estende gli oggetti EntityFieldQuery). Inizialmente EntityFieldQuery ti restituisce solo l'ID entità, il pacchetto e il tipo di entità. Questo modulo aggiunge un ulteriore livello in più, senza fare alcun extra_loads! Importante se si desidera lavorare con enormi quantità di dati e si desidera ridurre le query sql. Poiché EFQ richiede già queste informazioni al database, perché non modificare quella query per fornire anche alcuni campi aggiuntivi. Ciò significa che non verrà eseguita una singola query aggiuntiva per ottenere quei dati.

Un avvertimento, se si fa affidamento su alcuni post-formattazione / post-caricamento che si verificano in entity_load o funzioni simili, questo modulo non se ne occuperà. Devi garantire tu stesso la validità dei dati recuperati.

Esempio

Recupero del titolo del nodo

$ query = new EntityFieldQueryExtraFields ();
  $ result = $ query-> entityCondition ('entity_type', 'node')
  -> propertyCondition ('type', 'my_bundle_type')
  -> propertyCondition ('status', 1)
  -> addExtraField ('field_myfield', value ', value')
  -> addExtraField ('field_mynodereffield', nid ', nid')
  -> addExtraField ('', 'title', 'title', 'node')
  -> fieldCondition ('field_myfield', 'value', 'some_value_to_filter_on', '=')
  -> execute ();
Possibili combinazioni:
addExtraField ($ field_name, $ column, $ column_alias = NULL, $ table = NULL)

field_name
Specificare da quale campo dovrebbe provenire il campo aggiuntivo. Se proviene da una tabella di base, lasciala vuota e compila l'argomento della tabella

colonna
Specifica il nome della colonna,

column_alias
Specifica l'alias della colonna,

tavolo
Facoltativamente, aggiungi qui qualcosa come nodo o utente (la tabella di base),

Ho provato sia questo modulo (EFQ Extra Fields) sia il modulo (attualmente sandbox) di mikeytown2 e quest'ultimo mi è sembrato molto meglio (più piacevole da usare, output più sensibile) e sembra anche essere mantenuto molto meglio del primo. Il modulo sandbox di mikeytown2 è su drupal.org/sandbox/mikeytown2/2209909 .
Oliver Coleman,
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.