2012-08-02 1 views
1

에 사용 된 선택으로 대체 될 것으로 보인다 이것은 어느 정도 관련이 How to preserve the order of the fields to be selected when using $query->addExpression()노조 자리 표시자를 사용하여 초기의 값이 노조

에 내가 여러 테이블에 union을하고하고 있어요. 그러나 나는 또한 어느 테이블에서 값이 오는지 알 필요가있다. 그래서 그냥 다음과 같이 덧붙입니다. $query->addExpression(':table', 'table_name', array(':table' => $table_name));

문제가되면 테이블 이름이 첫 번째 쿼리의 테이블 이름으로 바뀝니다. 우리가 개별적으로 그들은 모두 잘 봐, 당신은 예상 된 결과를 얻을 선택을 선택하면

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

$table_name = 'table_two'; 
$query_2 = db_select('table_two', 't2'); 
$query_2->fields('t2', array('field_1', 'field_2')); 
$query_2->addExpression(':table', 'table_name', array(':table' => $table_name));  

$table_name = 'table_three'; 
$query_3 = db_select('table_three', 't3'); 
$query_3->fields('t3', array('field_1', 'field_2')); 
$query_3->addExpression(':table', 'table_name', array(':table' => $table_name)); 

하지만 조합을 사용하는 경우에만 사방 table_one 표시됩니다

아래의 예를 확인하십시오.

// dpq($query_1) - OK 
SELECT t1.field_1 AS field_1, t1.field_2 AS field_2, 'table_one' AS table_name 
FROM 
{table_one} t1 

// dpq($query_2) - OK 
SELECT t2.field_1 AS field_1, t2.field_2 AS field_2, 'table_two' AS table_name 
FROM 
{table_two} t2 

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

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

내가이와 잠시 동안 내 머리를 은행 봤는데 때문에 아이디어가 좋은 것이 있으면 ...

+0

당신이'대신'의 UNION ALL'을 시도하는 경우 UNION'? – arnoudhgz

+0

는 이미 차이가 :('AS 저런 t1.field_2, field_1 AS t1.field_1 SELECT 없다는 것을 시도 무엇 ld_2, 'table_one'AS 테이블 이름 FROM {table_one} t1 UNION ALL SELECT t2.field_1 AS field_1, t2.field_2 AS field_2, 'table_one'AS 테이블 이름 FROM {table_two} t2 UNION ALL SELECT t3.field_1 AS field_1, t3.field_2 AS field_2, 'table_one'AS 테이블 이름 FROM {table_three} t3' – Max

답변

0

수면의 몇 시간 후, 나는이 함수에 아래로 추적 :

// @file includes/database/select.inc 
    public function arguments() { 
    // .... 

    // If there are any dependent queries to UNION, 
    // incorporate their arguments recursively. 
    foreach ($this->union as $union) { 
     $args += $union['query']->arguments(); 
    } 

    return $args; 
    } 

그리고 쿼리의 모든 선택 키가 동일한 키 :table을 가지므로 그 대신에 하나의 인수 만 사용하게됩니다.

솔루션 : 그냥 당신이 자리에 대한 다른 키를 사용하십시오. 우리는 위의 예에서 대체 할 경우

그래서 이러한 선 (:table_1 & :table_2 대신 :table주의 사항 :

$query_2->addExpression(':table_1', 'table_name', array(':table_1' => $table_name)); 
$query_3->addExpression(':table_2', 'table_name', array(':table_2' => $table_name)); 

짜잔가, 마지막으로 예상되는 결과를 얻을 수는 사람을 도움이되기를 바랍니다, 반나절 내려고 잃었다. 밖으로 왜 이런 일이되었다.

SELECT t1.field_1 AS field_1, t1.field_2 AS field_2, 'table_one' AS table_name 
FROM 
{table_one} t1 UNION ALL SELECT t2.field_1 AS field_1, t2.field_2 AS field_2, 'table_two' AS table_name 
FROM 
{table_two} t2 UNION ALL SELECT t3.field_1 AS field_1, t3.field_2 AS field_2, 'table_three' AS table_name 
FROM 
{table_three} t3