2012-08-02 39 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)); 
} 
相關問題