2015-11-06 108 views
0

我有一個情況我需要查詢一些節點和連接兩個連接到該節點的字段。這兩個字段都可以具有無限的值,因此字段表中有多行。我試圖讓它返回字段中找到的nid和所有值記錄。的Drupal 7選擇查詢連接

$query = db_select('node', 'n'); 
    $query->leftJoin('field_data_aaa_alert_path', 'ap', 'n.nid = ap.entity_id'); 
    $query->leftJoin('field_data_aaa_alert_region', 'ar', 'n.nid = ar.entity_id'); 
    $query 
    ->fields('n', array('nid')) 
    ->fields('ap', array('aaa_alert_path_value')) 
    ->fields('ar', array('aaa_alert_region_value')) 
    ->groupBy('n.nid') 
    ->condition('type', 'aaa_alert') 
    ->condition('status', 1) 
    ->orderBy('created', 'DESC'); 

    $result = $query->execute(); 
    while($record = $result->fetchAssoc()){ 
    //... 
    } 

這工作,但它只會返回1個記錄aaa_alert_path_value和aaa_alert_region_value時,其實還有更多。

然後我試圖嘗試模塊EntityFieldQuery Extra Fields

$query = new EntityFieldQueryExtraFields(); 
    $query->entityCondition('entity_type', 'node') 
     ->entityCondition('bundle', 'aaa_alert') 
     ->propertyCondition('status', NODE_PUBLISHED) 
     ->addExtraField('aaa_alert_region', 'value') 
     ->addExtraField('aaa_alert_path', 'value') 
     ->propertyOrderBy('created', 'DESC'); 

    $result = $query->execute(); 

這工作,將返回所有的記錄,這兩個領域,我需要,但有這個模塊中的錯誤,如果兩個一個不會返回任何東西字段不包含記錄。

我已經嘗試使用不同的連接,但我似乎無法得到它的權利。我在這裏錯過了什麼?我試圖做到這一點,而不使用EntityFieldQuery類,因爲它會要求我返回所有返回的結果以獲取我需要的字段,這是巨大的性能影響。與->groupBy('n.nid')

回答

0

問題存在什麼GROUPBY方法做的是一個類似的節點ID的所有記錄合併成一個結果。刪除這將允許每個節點ID的多個結果。請注意,在while循環中,每個字段值將作爲單獨的記錄返回。如果您想將它們按每個節點分成單個陣列,則可以執行下列操作:

<?php 

$query = db_select('node', 'n'); 
$query->leftJoin('field_data_aaa_alert_path', 'ap', 'n.nid = ap.entity_id'); 
$query->leftJoin('field_data_aaa_alert_region', 'ar', 'n.nid = ar.entity_id'); 
$query 
    ->fields('n', array('nid')) 
    ->fields('ap', array('aaa_alert_path_value')) 
    ->fields('ar', array('aaa_alert_region_value')) 
    ->condition('type', 'aaa_alert') 
    ->condition('status', 1) 
    ->orderBy('created', 'DESC'); 

$result = $query->execute(); 
while($record = $result->fetchAssoc()){ 
    $nid = $result['nid']; 
    $grouped[$nid][] = $record; 
} 

foreach($grouped as $nid => $value) { 
    // ... 
} 
+0

謝謝!完美的作品 –