2015-11-06 69 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

谢谢!完美的作品 –