PHP中列的数据库映射

时间:2012-12-12 20:27:23

标签: php mysql database relational-database

我有一个数据库表列表,它们都根据列名和字段值一起工作。

我可以使用简单的主ID列字段值匹配来提取大约3/4的表。

使用我当前能够提取的表格,我希望能够根据表格中可能的列匹配来检索其余数据。

我已经开始了一个想法..但我不太确定如何完成这个过程。

这个网站正在使用WordPress,但理想情况下,这仍然可以通过直接的PHP完成,而无需使用WordPress数据库类。

检索有关学校的所有信息: $school = $this->get_school('129020');

功能:$this->get_school($id);

private function get_school($id){
    global $wpdb;
    /* Retrieve the IPEDS database tables. */
    $columns = $this->map_database('iped');
    /* Retrieve the initial results by the UNITID. */
    $data = array();
    foreach($columns['UNITID']['shared_tables'] as $table){
        $data[$table] = $wpdb->get_results(
            "
            SELECT *
            FROM `{$table}`
            WHERE `UNITID` = '{$id}';
            ", 
            ARRAY_A
        );
    }
    return $data;
}

功能:$this->map_database($database_table)

private function map_database($database_table = 'all'){
    global $wpdb;
    /* Get all of the database tables. */
    $tables = $wpdb->get_results('SHOW TABLES', ARRAY_N);
    $table_columns = array();
    foreach($tables as $table){
        if($database_table != 'all'){
            /* Filter tables by partial string matching the table name. */
            if(stripos($table[0], $database_table) === false){
                continue;
            }
        }
        /* Get all of the columns available in each database table. */
        $columns = $wpdb->get_results(
            "
            SELECT *
            FROM   information_schema.columns
            WHERE  table_name = '{$table[0]}'
            ORDER  BY ordinal_position  
            ",
            ARRAY_A
        );
        for($i = 0; $i < count($columns); $i++){
            $column = $columns[$i];
            /* Don't overwrite any data. Could result in missing or overlapping of data? */
            if(isset($table_columns[$table[0]]) && in_array($column['COLUMN_NAME'], $table_columns[$table[0]])){
                continue;
            }
            $table_columns[$table[0]][] = $column['COLUMN_NAME'];
        }
    }
    return $this->map_database_tables($tables, $table_columns);
}

功能:$this->map_database_tables($database_tables, $database_consolidated);

/* 
$database_tables - Array consisting of strictly database tables. 
$database_consolidated - Nested array consisting of: table_name => table_columns
*/      
private function map_database_tables($database_tables, $database_consolidated){
    if(empty($database_tables) || empty($database_consolidated)){
        return;
    }
    $common_columns = array();

    foreach($database_consolidated as $table_name => $table_columns){
        for($i = 0; $i < count($table_columns); $i++){
            $table_column = $table_columns[$i];
            /* Find similar table columns in other database tables. */
            $search = $this->search_database_tables($database_consolidated, $table_column);
            if(!empty($search)){
                foreach($search as $column => $table){
                    $common_columns[$table_column]['shared_tables'] = $table;
                }
            }
        }
    }
    return $common_columns;
}

功能:$this->search_database_tables($tables, $column_name);

/* Returns column name and database tables sharing the column name. */
private function search_database_tables($tables, $column_name){
    $common_tables = array();
    foreach($tables as $table_name => $table_columns){
        if(in_array($column_name, $table_columns)){
            $common_tables[$column_name][] = $table_name;
        }
    }
    return $common_tables;
}

以下列格式生成数组:

$database_map = array(
    'table_name' => array(
        'row_number' => array(
            'field_key' => 'field_value'
        )
    )
);

我感到疑惑的是下一步该做什么?我该怎么做?

我掌握了所有数据,但我只是难以接受下一步的操作。

这就是我的想法,但绝对需要一些指导或输入.....

我想检查其他表列的值。因此,例如,如果我正在查找辅助ID号,该号码仅存在于尚未被主ID号提取的其他表中。

表1可能有一个名为“Secondary”的列,字段值为“123”。

我想循环遍历所有其他数据库表,以查看是否存在“辅助”列。如果是,则根据该列名称的两个表字段值的匹配列名和字段值,从该表中提取所有字段。

我确信我的代码绝对可怕,可能会大大简化。我已经找到了一些可能已达到我预期目标的现有框架。我找不到任何东西都没有运气。

我愿意接受我的代码下一步的建议。我也对可以使用的任何现有框架持开放态度。

0 个答案:

没有答案