2013-12-12 4 views
5

Zum Beispiel habe ich eine EFQ Anfrage wie:SortiertNach ausfiltert Reihe mit leeren Feld in 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') 

Die field_code NULL festlegbaren ist. Wenn ich nach diesem Feld sortiere, werden alle Zeilen mit einem Nullwert ausgeschlossen. Wie vermeidet man dieses Verhalten und lässt sie im Ergebnis bleiben?

+0

Wie Sie vielleicht bei der Suche nach drupal.org bemerkt haben, ist Ihr Problem eine Dose Würmer ... Haben Sie eine Chance, dass Ihr Feld nicht NULL-fähig ist? – pamatt

+0

Absolut nicht, es ist wirklich schlecht! Es gibt absolut keine Möglichkeit, dies zu umgehen? –

+0

Wenn wir in Mysql sprechen, sollten Sie eine Bestellbedingung hinzufügen, wie 'field_code IS NULL'. Aber wenn wir über EFQ sprechen, ist es nicht einfach. Vielleicht könnten Sie EFQ mit hook_entity_query_alter ändern und queryCallback zu Ihrer eigenen Funktion ändern. – Maxim

Antwort

3

Ich musste ein Problem lösen, das dem kürzlich ähnlich ist, indem ich ein db_select() benutze und es gerade db_or() für isNull und isNotNull übergebe. Ich denke nicht, dass eine EFQ flexibel genug ist, um das zu tun, was Sie brauchen. Etwas nach dem Vorbild dieser sollte funktionieren:

$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; 
} 

Eine Frage aber - warum sind Sie versuchen, durch zwei verschiedene Felder in Ihrem Beispiel zu bestellen?

+0

Ich werde es so bald wie möglich versuchen! Ich habe versucht, etwas ähnliches zu schreiben, aber unmöglich, db_or() in EFQ zu verwenden. Ich muss Knoten nach Datum und nach Code bestellen, weil wir viele Knoten von einem Datum haben, so müssen wir es bestellen –

+0

Ja, es funktioniert, aber ... nicht mit EFQ .. so viel dafür –

Verwandte Themen