1

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

4

2 回答 2

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)

于 2012-10-19T10:24:31.880 回答
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列出了如何创建 ClassMetadata 对象以供 SchemaTool 使用。

我很想知道如何通过动态创建实体、将它们添加到 EntityManager 并创建表来做到这一点,但我认为这不是 Doctrine 团队的想法,所以我想我会有自己做很多。因此,作为一种妥协,我采用了这种方法:https ://groups.google.com/forum/#!msg/doctrine-user/FRnvpHN7nFg/_JVDv61esfYJ

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

于 2012-10-19T10:07:23.897 回答