2012-10-19 35 views
1

是否有任何現有的PHP庫來創建或更新從數據定義的MySQL表?例如,Silverstripe可以做到這一點 - 每個模型定義了數據:PHP庫從數據定義生成mysql表

$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

哦,是的,忘了提及教義。問題在於afaik Doctrine需要一種特定類型的數據定義,這些定義在實時構建時會有點困難 - 您能否輕鬆地在PHP中運行orm-schema-update命令,還是需要將其作爲shell命令?我想我可以生成簡單的YML,而不需要太多的工作......或者我可以直接使用模式定義工具嗎? –

+1

你可以自己編寫腳本......它實際上並不是那種很難使用的vsprintf($ format,$ data),其中$ data是一個數組(你的$ db-array),而$ format是查詢 –

回答

0

Doctrine2貌似要走的路...

http://docs.doctrine-project.org/en/latest/reference/tools.html介紹如何使用SchemaTool內PHP和http://docs.doctrine-project.org/en/2.1/reference/php-mapping.html規定了如何創建ClassMetadata對象爲SchemaTool消耗。

我很想知道如何做到這一點,只需動態創建實體,將它們添加到EntityManager並創建表格,但我認爲這不是理論團隊想到的,所以我認爲我必須自己做很多事情。因此,作爲一種妥協,我已經採取了這一做法:https://groups.google.com/forum/#!msg/doctrine-user/FRnvpHN7nFg/_JVDv61esfYJ

聽起來像是要走的路是創建動態陽明海運文件(我的數據類型都是簡單的,所以這是不是太硬),創建從該的entites YML,然後運行架構工具。然而,我將不得不回到這個問題 - 爲了項目的好處,現在要以人工方式創建數據庫。

+0

當你想出來時,請用更多的細節更新答案;) – Michael

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)

+0

感謝你的想法,但這實際上不是我所需要的 - 這隻會完成創建數據庫的第一步,簡單的步驟。如果我想用新字段更新表格,該怎麼辦?這需要查看數據庫模式,這不是我想爲一個小項目手動編寫的代碼。 –

+0

嗯你是什麼意思「更新表與新領域」?添加一個全新的字段(如提醒表)或只更新一些值? –

+0

改變表格。所以,突然之間,你需要能夠看到表格中存在哪些列,等等......我只是在那裏學習,會用我的方法更新我的答案,這肯定會得到改進。 –