2013-12-12 25 views
5

Na przykład, mam prośbę EFQ jak:OrderBy odfiltrowuje wiersz z pustym polu w 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') 

field_code jest pustych. Gdy dokonam zamówienia w tym polu, wykluczone zostaną wszystkie wiersze, które uzyskały wartość pustą. Jak uniknąć tego zachowania i pozwolić im pozostać w wyniku?

+0

Jak być może zauważyliście przeszukując drupal.org, waszym problemem jest puszka z robakami ... Czy jest jakaś szansa na to, aby wasze pole było nieopłacalne? – pamatt

+0

Absolutnie nie, jest naprawdę źle! Nie ma absolutnie żadnego sposobu na ominięcie tego? –

+0

Jeśli mówimy w kategoriach Mysql, powinieneś dodać warunki zamówienia takie jak 'field_code IS NULL'. Ale jeśli mówimy o EFQ, nie jest to łatwe. Może mógłbyś zmienić EFQ za pomocą hook_entity_query_alter i zmienić queryCallback na swoją własną funkcję. – Maxim

Odpowiedz

3

Skończyło się na konieczności rozwiązania problemu podobnego do tego ostatnio przy użyciu db_select() i właśnie przekazanie go db_or() dla isNull i isNotNull. Nie sądzę, że EFQ jest wystarczająco elastyczny, aby robić to, czego potrzebujesz. Coś wzdłuż linii to powinno działać:

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

choć jedno pytanie - dlaczego próbują zamówić przez 2 różnych pól w swoim przykładzie?

+0

Spróbuję to jak najszybciej! Próbowałem napisać coś podobnego, ale niemożliwe do użycia db_or() w EFQ. Muszę zamówić węzeł według daty i kodu, ponieważ mamy wiele węzłów z jednej daty, więc musimy to zamówić –

+0

Tak, działa, ale ... nie z EFQ .. tyle za to –