2012-08-02 62 views
2

我正在使用Drupal 7,并且必须在多个表上创建一个联合。对于工会工作的一些条件必须满足:

  1. 相同的列数
  2. 相同的数据类型
  3. 相同为了

,某些表失一列,因此为了弥补这一点,我只是像这样添加它:$query->addExpression(':field_1', 'field_1', array(':field_1' => NULL));。因此,在这种情况下,条件1 & 2得到满足,选择字段的顺序是不同的。

参见下文例如:

$query_1 = db_select('table_one', 't1'); 
    $query_1->fields('t1', array('field_1', 'field_2')); 

    $query_2 = db_select('table_two', 't2'); 
    if (true) { 
    $query_2->fields('t2', array('field_1')); 
    } else { 
    $query_2->addExpression(':field_1', 'field_1', array(':field_1' => NULL)); 
    } 
    $query_2->fields('t2', array('field_2'));   

    $query_3 = db_select('table_three', 't3'); 
    if (false) { 
    $query_3->fields('t3', array('field_1')); 
    } else { 
    $query_3->addExpression(':field_1', 'field_1', array(':field_1' => NULL)); 
    } 
    $query_3->fields('t3', array('field_2')); 

,其结果是:

// dpq($query_1); 
SELECT t1.field_1 AS field_1, t1.field_2 AS field_2 
FROM {table_one} t1 

// dpq($query_2); 
SELECT t2.field_1 AS field_1, t2.field_2 AS field_2 
FROM {table_two} t2 

// dpq($query_3); 
SELECT t3.field_2 AS field_2, '' AS field_1 
FROM {table_three} t3 

// dpq($query_1->union($query_2)->union($query_3)); 
SELECT t1.field_1 AS field_1, t1.field_2 AS field_2 
FROM {table_one} t1 
UNION SELECT t2.field_1 AS field_1, t2.field_2 AS field_2 
FROM {table_two} t2 
UNION SELECT t3.field_2 AS field_2, '' AS field_1 
FROM {table_three} t3 

似乎使用$query->addExpression将不能保证场的位置是在你期望的那样。查看已使用addExpression的第3个查询的转储。关于如何解决这个问题的任何想法?

回答

1

这是我发现的唯一解决方法,以保持顺序。即使该字段存在与否,也可以使用表达式。这样的顺序是你所期望的顺序:

if (TRUE) { 
    // To keep the order of the fields we have to use this hacky way. 
    // Use a function that will not modify the string 
    $query->addExpression("IFNULL(table_name.field_name, '')", 'field_name_alias'); 
} else { 
    $query->addExpression(':field', 'field_name_alias', array(':field' => NULL)); 
} 
相关问题