2013-12-12 42 views
5

例如,我有一個像EFQ請求:的OrderBy濾除與空場行中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可爲空。當我按這個字段排序時,它將排除所有有空值的行。如何避免這種行爲並讓他們留在結果中?

+0

正如你可能已經注意到通過搜索drupal.org,你的問題是一罐蠕蟲......任何機會,你可以讓你的領域不可空? – pamatt

+0

絕對不是,這真的很糟糕!絕對沒有辦法繞過這個? –

+0

如果我們談論Mysql,你應該添加像'field_code IS NULL'這樣的順序條件。但是如果我們談論EFQ,這並不容易。也許你可以用hook_entity_query_alter修改EFQ,並將queryCallback更改爲你自己的函數。 – Maxim

回答

3

我最終不得不通過使用db_select()來解決與此類似的問題,只是將它傳遞給is_Null和isNotNull的db_or()。我認爲EFQ不夠靈活,無法滿足您的需求。沿線的東西應該工作:

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

雖然一個問題 - 爲什麼你要在你的例子中的2個不同的領域訂購?

+0

我會盡快嘗試! 我試着寫類似的東西,但不可能在EFQ中使用db_or()。 我必須按日期和按代碼排序節點,因爲我們在一個日期有很多節點,所以我們需要訂購它 –

+0

是的,它的工作,但...不是與EFQ ..這麼多 –