2013-07-02 28 views
-2

我想使用迁移模块将Drupal7网站的内容迁移到另一个Drupal7系统。如果表中存在MySQL列,请检查PHP

我必须添加和映射字段。 drupal中每种内容类型的字段都存储在名为field_revision_field_name的表中。大多数字段的值在列field_name_value。但有些字段有另一种结构,所以我想检查field_name_value列是否存在。

我正在连接表并在一个循环中的mysql查询中添加字段。问题是,并不是每一个表"field_revision_".$typeFields[$i](别名是$typeFields[$i]."_table")有一栏$typeFields[$i]."_value"

for ($i=0; $i < sizeof($typeFields); $i++) { 
    $query->join(
     "field_revision_".$typeFields[$i], 
     $typeFields[$i]."_table", 
     "n.nid = ".$typeFields[$i]."_table.entity_id" 
    ); 
    $query->addField($typeFields[$i]."_table", $typeFields[$i]."_value");  
} 

我要检查这个我做的查询,这样的事情之前:

for ($i=0; $i < sizeof($typeFields); $i++) { 
    if($typeFields[$i]."_table" has Column $typeFields[$i]."_value"){ 
    $query->join(
     "field_revision_".$typeFields[$i], 
     $typeFields[$i]."_table", 
     "n.nid = ".$typeFields[$i]."_table.entity_id" 
    ); 
    $query->addField($typeFields[$i]."_table", $typeFields[$i]."_value"); 
    }  
} 
+0

有什么问题相似? –

+2

一般来说,数据库模式以这种方式动态化是不好的设计。您试图解决的业务问题是什么导致您使用动态模式?我担心这个问题可能是[XY问题](http://meta.stackexchange.com/a/66378)的事件。 – eggyal

+0

动态模式意味着不断重建索引不是吗? – crush

回答

1

这真的是这样的XY问题。

D7函数field_info_field()有关于存储数据的列的信息,所以我不必问是否存在列。

但三江源

2
  1. @eggyal在关于动态模式的评论中说的不好。
  2. 使用information_schema数据库以下查询:

    SELECT * 
    FROM `COLUMNS` 
    WHERE TABLE_SCHEMA = 'database_name' 
        AND TABLE_NAME = 'table_name' 
        AND COLUMN_NAME = 'field_name' 
    
+0

我不明白。我在我的代码中查询这个,然后呢? – dba

+0

@dba如果结果集中有一行,那么该字段存在于表中。 – Sammitch

0

也许这可以帮助

$fields = mysql_list_fields('database_name', 'table_name'); 
$columns = mysql_num_fields($fields); 
for ($i = 0; $i < $columns; $i++) {$field_array[] = mysql_field_name($fields, $i);} 
if (!in_array('price', $field_array)){ 
    $result = mysql_query('ALTER TABLE table_name ADD price VARCHAR(10)'); 
} 
0

怎么样这样:

​​ 这是一个与上述

相关问题