PHP库从数据定义生成mysql表

时间:2012-10-19 09:49:57

标签: php mysql

是否有任何现有的PHP库可以从数据定义创建或更新mysql表?例如,Silverstripe可以做到 - 每个模型都定义了它的数据:

$db = array(
    'FieldName' => 'Boolean',
    'FieldName2' => 'Text',
);

$has_one = array(
    'RelationName' => 'ObjectType'
);

根据

生成一个表格
CREATE TABLE classname (Id INT, FieldName BOOLEAN, FieldName2 TEXT, RelationNameId INT)

或者其他什么。将列添加到db数组时,它们会被添加到数据库中;如果新表与旧表不兼容,则创建新表并将旧数据导入新表。很确定它也处理各种索引和事情。

是否有任何独立的PHP库可以执行此操作?我不想在这个项目中使用Silverstripe。

我的最终目标是能够在HTML中创建一个包含表标识符和几个输入字段的表单,并将其提交给控制器,该控制器将为每个提交的数据创建一个包含数据类型的表。如果我在表单中添加一个字段,我希望控制器更新相应的表。

请不要建议从数据类型数组中编写CREATE TABLE语句的方法 - 这只是我需要的开始。我还需要能够通过更改PHP中的数据类型数组来更新现有表 - 这比创建CREATE TABLE要困难得多。

2 个答案:

答案 0 :(得分:0)

Doctrine2看起来像是要走的路......

http://docs.doctrine-project.org/en/latest/reference/tools.html描述了如何在PHP中使用SchemaTool,http://docs.doctrine-project.org/en/2.1/reference/php-mapping.html阐述了如何为SchemaTool创建使用的ClassMetadata对象。

我很想知道如何通过动态创建实体,将它们添加到EntityManager以及创建表格来实现这一目标,但我认为这不是Doctrine团队想到的,所以我想我我必须自己做很多事情。作为妥协,我遵循了这种方法:https://groups.google.com/forum/#!msg/doctrine-user/FRnvpHN7nFg/_JVDv61esfYJ

听起来像是要动态创建YML文件(我的数据类型都很简单,所以这不是太难),从YML创建entites,然后运行模式工具。但是,我将不得不回到这一点 - 为了项目的利益,现在为手动方式创建数据库。

答案 1 :(得分:0)

好的,这里只是一个非常简单的例子,我将如何做(当然它是非常基本的),但你可以让函数将它保存到.sql文件或其他任何东西。正如我所说,我暂时不会使用它 - 所以我不认识表演等。

<?php

define ('INTEGER', 'INT'); // may use constants etc.

function createTable($name, $fields)
{
    $format = 'CREATE TABLE %s (%s)';

    foreach ($fields as $field)
    {
        $buffer[] = $field[0] . ' ' . $field[1];
    }

    $buffer = implode('; ', $buffer); // need to seperate list with a char different to comma
    $result = sprintf($format, $name, $buffer); // else it would be another argument for sprintf
    $result = str_replace(';', ',', $result); // replace the char with a comma

    print_r($result);
    return $result;
}

$name = 'mytable';
$data = array(
    array ('field 1', 'INT'),
    array ('field 2', 'VARCHAR (30)'),
    array ('foo', 'BAR'),
    array ('foo', INTEGER)
);

createTable($name, $data);

?>

输出:CREATE TABLE mytable (field 1 INT, field 2 VARCHAR (30), foo BAR, foo INT)