从数据定义生成mysql表的PHP库

从数据定义生成mysql表的PHP库,php,mysql,Php,Mysql,是否有任何现有的PHP库可以从数据定义创建或更新mysql表?例如,Silverstripe可以做到这一点-每个模型都定义其数据: $db = array( 'FieldName' => 'Boolean', 'FieldName2' => 'Text', ); $has_one = array( 'RelationName' => 'ObjectType' ); 这将沿以下行生成一个表: CREATE TABLE classname (Id INT

是否有任何现有的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创建一个表单,其中包含一个表标识符和几个输入字段,并将其提交给一个控制器,该控制器将为提交的每个数据段创建一个包含数据类型的表。如果我在表单中添加一个字段,我希望控制器更新相应的表


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

Doctrine2看起来像是一种方法

描述如何在PHP中使用SchemaTool,并说明如何创建用于SchemaTool的ClassMetadata对象

我很想知道如何通过动态创建实体、将它们添加到EntityManager并创建表来做到这一点,但我认为这不是条令团队的想法,所以我认为我必须自己做很多事情。因此,作为一种折衷,我采用了以下方法:


听起来应该是动态创建YML文件我的数据类型都很简单,所以这并不难,从YML创建Entite,然后运行schema工具。然而,我将不得不回到这里——为了项目的利益,现在将以手动方式创建数据库

好的,这里只是一个非常简单的例子,说明我将如何做。当然,这是非常基本的,但您可以让函数将其保存到.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);

?>

输出:创建表mytable字段1 INT,字段2 VARCHAR 30,foo BAR,foo INT

哦,是的,忘了提到条令。问题是afaik原则需要一种特定类型的数据定义,这在动态构建中有点困难——您可以在PHP中轻松运行orm模式更新命令,还是需要将其作为shell命令?我想我可能不需要太多的努力就可以生成所需的简单YML。。。或者我可以直接使用模式定义工具吗?您可以自己编写脚本。。。事实上,它并不是那么难用的vsprintf$format,$data,其中$data是一个数组,您的$db数组和$format您的查询我在我的问题中解决了这个问题。保持它的最新状态比这要复杂得多它不是一个数组,而是一个xml,但很容易映射。在PHP中,它不像Doctrine2那样得到了很多支持。我必须创建一个XML文件,调用这些shell命令,包括生成的PHP文件,然后运行迁移类的代码。感觉有点不对劲。当你弄明白后,请用更多的细节更新答案;谢谢你的想法,但这真的不是我需要的-这只会完成创建db的第一步,简单的一步。如果我想用一个新字段更新表怎么办?这需要查看数据库模式,我不想为一个小项目编写代码。嗯,用新字段更新表是什么意思?添加一个全新的字段,如警告表或只是更新一些值?更改表。因此,突然之间,您需要能够看到表中存在哪些列,等等。。。我只是在那里与学说,将更新我的答案与我的方法,这肯定是可以改进的。我面临着同样的问题,并没有找到一个好的解决方案或图书馆。请发布更多关于你的经验。