2012-08-02 1 views
2

저는 Drupal 7을 사용하고 있고 여러 테이블에서 공용체를 만들어야합니다. 노조는 몇 가지 조건이 충족되어야한다 작동하려면 : 열

  1. 같은 수의 테이블 중 일부는 너무 열을 누락

  • 동일한 데이터 유형
  • 같은 위해 이를 보상하기 위해 다음과 같이 추가합니다 : $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이 사용 된 세 번째 쿼리의 덤프를 살펴보십시오. 이 문제를 해결하는 방법에 대한 아이디어가 있습니까?

  • 답변

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