2013-12-12 3 views
5

Ad esempio, ho una richiesta EFQ come:OrderBy filtra riga con campo vuoto EntityFieldQuery

$query ->entityCondition('entity_type', 'node') 
     ->entityCondition('bundle', 'contenttype')  
     ->propertyCondition('status', 1) 
     ->propertyCondition('language', $language->language, '=') 
     ->fieldOrderBy('field_date', 'value', 'DESC') 
     ->fieldOrderBy('field_code', 'value', 'DESC') 

Il field_code è annullabile. Quando ordino da questo campo, esclude tutte le righe che hanno un valore nullo. Come evitare questo comportamento e lasciarli rimanere nel risultato?

+0

Come avrete notato dalla ricerca drupal.org, il tuo problema è un vaso di Pandora ... Ogni possibilità è possibile rendere il campo non annullabile? – pamatt

+0

Assolutamente no, è davvero brutto! Non c'è assolutamente alcun modo per aggirare questo? –

+0

Se parliamo di Mysql dovresti aggiungere una condizione dell'ordine come "field_code IS NULL". Ma se parliamo di EFQ non è facile. Forse potresti modificare EFQ con hook_entity_query_alter e cambiare queryCallback nella tua funzione. – Maxim

risposta

3

Alla fine ho dovuto risolvere un problema simile a questo di recente usando un db_select() e passando semplicemente un db_or() per isNull e isNotNull. Non penso che un EFQ sia abbastanza flessibile da fare ciò di cui hai bisogno. Qualcosa sulla falsariga di questo dovrebbe funzionare:

$query = db_select('node', 'n') 
->fields('n') 
->condition('n.type', 'contenttype') 
->condition('n.status', 1) 
->leftJoin('field_data_field_code', 'c', 'n.nid = c.entity_id') 
->fields('c'); 

$db_or = db_or(); 
$db_or->isNull('c.field_code_value'); 
$db_or->isNotNull('c.field_code_value'); 

$query->condition($db_or); 

$query->orderBy('c.field_code_value', 'DESC'); 

$results = $query->execute()->fetchAllAssoc('nid'); 

if ($results) { 
    $nodes = node_load_multiple(array_keys($results)); 
    return $nodes; 
} 

Una domanda però - il motivo per cui è si sta cercando di ordinare da 2 campi diversi nel tuo esempio?

+0

Cercherò al più presto! Ho provo a scrivere qualcosa di simile, ma impossibile da usare db_or() in EFQ. devo ordinare nodo per data e per codice perché abbiamo molti nodi da una data così abbiamo bisogno di ordinare –

+0

Sì farlo funzionare, ma ... non con EFQ .. tanto per quel –