如何保留字段的顺序使用$查询 - 时,可以选择> addExpression()(How to

2019-09-20 16:30发布

我使用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已被使用。 如何解决这个问题的任何想法?

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


文章来源: How to preserve the order of the fields to be selected when using $query->addExpression()