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も、フィールドの位置が期待どおりになるとは限らないようです。使用された3番目のクエリのダンプを見てくださいaddExpression。この問題を解決する方法について何かアイデアはありますか?

4

2 に答える 2

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));
}
于 2012-08-14T08:44:57.877 に答える
0

簡単な例を追加したいと思います。代わりにフィールドの順序を維持するため

$query->addField('n', 'uid', 'node_uid');

あなたは書ける

$query->addExpression('n.uid', 'node_uid');
于 2020-03-16T05:40:28.117 に答える