是否有任何现有的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要困难得多。
答案 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)