2014-09-24 92 views
9

我是Laravel的新手,所以這個框架的最佳實踐有點新。我正在嘗試瞭解使用migrations創建數據庫的最佳方法。Laravel每遷移多個表

我在網上找到的幾個例子,包括Laravel文檔herehere,似乎是指僅處理一個表的遷移腳本。我創建了一個包含大約10個表的應用程序,它們之間都與外鍵相關,有些表與多對多的關係有關。

  1. 推薦的方法是每個表有一個遷移文件?如果是這樣,爲什(將所有表創建腳本放在一個文件中有什麼缺點(如果有的話)?

  2. 外鍵和關係怎麼樣?如何執行這些關係以及執行遷移的順序,以便如果table1引用table2中的列,則table2會在table1之前創建?

  3. 多對多的關係呢?關係(透視)表是否需要通過單獨的遷移腳本手動創建?如果是,確保它是在2個相關的表格之後創建的?

回答

14

在你的應用程序的開發,我不認爲你應該太在意其每遷移只有一張桌子,有時它只是更容易有一些表togheter在一個單一的遷移,但只要你的系統中去到生產,你將無法繼續這樣工作,因爲你只能在生產環境中遷移,而且可能永遠不會回滾,所以你的遷移將會非常小,有時你會爲單個列的創建進行遷移。

將表格放在不同遷移中的優點與具有薄類別相同,您在一個文件中擁有的信息越少,管理和更改就越容易。因此,如果您將所有表格都放在一個遷移中,則維護起來會更困難,但這真的取決於您。

外鍵是爲什麼您應該爲每個表甚至每個外鍵創建一個遷移的好例子:每次您回滾與外鍵相關的表時,必須先刪除所有外鍵依賴關係,這就是爲什麼Laravel創建遷移他們都在相同的順序,它可以幫助你永遠不會擰表下降。所以,首先創建你的表遷移,然後創建你的外鍵遷移,所以當你回滾時它將首先回滾約束,然後回滾表。

我在該表的相同遷移中爲表創建外鍵,除非我有太多的交叉外鍵。但是,我總是創建一個單獨的Schema::table()命令外鍵,因爲某些數據庫需要你的限制連接到它之前有柱:

public function up() 
{ 
    Schema::create('statuses', function(Blueprint $table) 
    { 
     $table->string('id', 64)->primary(); 

     $table->string('user_id', 64)->index(); 
     $table->text('body'); 

     $table->timestamps(); 
    }); 

    Schema::table('statuses', function(Blueprint $table) 
    { 
     $table->foreign('user_id') 
       ->references('id') 
       ->on('users') 
       ->onUpdate('cascade') 
       ->onDelete('cascade'); 
    }); 
} 

關於多對多的,如果你創建togheter表和外鍵,你應該首先創建主數據庫,然後創建數據透視表,但是如果要在單獨的遷移中創建外鍵,首先創建表(順序無關緊要,但最好在這些情況下組織),然後外鍵的遷移。

在開發過程中我做了很多在我的表的變化,所以我總是回來給他們,所以這是我用來做什麼,當我改變遷移:

1)php artisan migrate:reset多次

2)改變遷移

3)php artisan migrate

如果我只是創造一個新的,平時我不會有任何問題,因爲移民通常是idepotent。

你的最後一個問題已經回答了,但我再說一遍:Laravel名稱使用時間戳的遷移文件中,這樣你就永遠不會有一個遷移之前,另一個之前創建正在運行:

2014_07_16_190821_create_statuses_table 

和遷移問題的名字,因爲這一塊上面將創建這個類:

CreateStatusesTable 

這麼一件事你必須做的是創造一個不同的名稱每遷移,否則你將最終有兩個班,同名,而不是Laravel,但PHP會投訴它。

+0

非常感謝您的解釋。它非常有幫助。是的,我完全理解一旦應用程序在生產中需要進行小的增量更改。我不確定大部分表格的最初基礎創建是如何讓我走的。但是,考慮到時間戳實際上強制執行遷移的順序(我錯過了),我想我不應該擔心由於不存在的表而不會創建關係。再次感謝! – jbx 2014-09-25 00:29:05

+0

終於有一些很好的實用laravel信息。他們的教程和文檔是真實的,但它通常包含基本用例,而不是嚴格編程所需的東西。 – Srneczek 2015-06-03 12:32:43

+0

非常好的答案我認爲這是事實,但我很高興你已經證實了它,它爲什麼有意義,但我可以看到爲什麼OP問這個問題,因爲我想知道同樣的問題。 – rosscooper 2016-04-12 23:12:40