2012-10-04 51 views
48

我剛剛學習Laravel,並且有一個工作遷移文件創建用戶表。我想填充用戶記錄作爲遷移的一部分:在Laravel遷移文件中填充數據庫

public function up() 
{ 
    Schema::create('users', function($table){ 

     $table->increments('id'); 
     $table->string('email', 255); 
     $table->string('password', 64); 
     $table->boolean('verified'); 
     $table->string('token', 255); 
     $table->timestamps(); 

     DB::table('users')->insert(
      array(
       'email' => '[email protected]', 
       'verified' => true 
      ) 
     ); 

    }); 
} 

但運行php artisan migrate時,我收到以下錯誤:

SQLSTATE[42S02]: Base table or view not found: 1146 Table 'vantage.users' doesn't exist 

這顯然是因爲工匠尚未建立該表,但所有文檔似乎都表示,有一種使用Fluent Query來遷移數據的方式。

任何人都知道如何?謝謝!

回答

115

不要把DB ::插入()架構::創建()內,因爲創建方法來完成你之前做的表可以插入東西。試試這個:

public function up() 
{ 
    // Create the table 
    Schema::create('users', function($table){ 
     $table->increments('id'); 
     $table->string('email', 255); 
     $table->string('password', 64); 
     $table->boolean('verified'); 
     $table->string('token', 255); 
     $table->timestamps(); 
    }); 

    // Insert some stuff 
    DB::table('users')->insert(
     array(
      'email' => '[email protected]', 
      'verified' => true 
     ) 
    ); 
} 
+0

Thankyou Benjamin,這太棒了! –

+0

以及如何插入多個數據? –

-4

嘗試:(未測試)

public function up() 
{ 
    Schema::table('users', function($table){ 

     $table->increments('id'); 
     $table->string('email', 255); 
     $table->string('password', 64); 
     $table->boolean('verified'); 
     $table->string('token', 255); 
     $table->timestamps(); 

     $table->insert(
      array(
       'email' => '[email protected]', 
       'verified' => true 
      ) 
     ); 

    }); 
} 
+0

謝謝@ aowie1 - 我已經嘗試過,但它錯誤,因爲'Table :: insert()'不是一個有效的方法 –

1

這應該做你想要什麼。

public function up() 
{ 
    DB::table('user')->insert(array('username'=>'dude', 'password'=>'z19pers!')); 
} 
+0

Thanks @ strings28,但是你看到我已經在一個月前接受了類似的答案嗎? –

+0

顯然我沒有 - 對不起:) – strings28

9

這就是爲什麼使用Laravel的數據庫播種機最好使用遷移一個很好的解釋:因爲執行情況的描述http://laravelbook.com/laravel-database-seeding/

雖然,下面就以正式文件的說明是一個更好的主意上面的鏈接似乎不起作用,是不完整的。 http://laravel.com/docs/migrations#database-seeding

+1

我同意你艾琳。不要將遷移與種子數據混合使用,因爲您很可能希望在開發環境中生成一些數據,而不是在生產環境中生成一些數據。 –

+10

好點,但有些情況下生產環境中必須存在一些數據。例如,第一個默認管理員用戶必須存在,這樣客戶才能第一次登錄,一些預設的授權角色必須存在,一些商業邏輯數據也可能需要立即生效。因此,我認爲強制性數據應該添加到遷移中(這樣您可以通過單獨遷移來上/下數據記錄),但種子可以留待開發。 – JustAMartin

+0

小記;現在鏈接到數據庫播種:https://laravel.com/docs/5.3/seeding – magikMaker

42

我知道這是一箇舊的帖子,但因爲它出現在谷歌搜索我想我會在這裏分享一些知識。 @ erin-geyer指出,混合遷移和播種器會產生令人頭疼的問題,而@justamartin反駁說,有時候需要/需要將數據填充爲部署的一部分。

我更進一步說,有時候希望能夠一致地推出數據更改,以便您可以例如部署到分段,看到一切正常,然後有信心部署到生產的結果相同(而且不必記得運行一些手動步驟)。

然而,在分離種子和遷移方面仍然有價值,因爲這些是兩個相關但不同的問題。我們的團隊通過創建稱爲播種器的遷移來進行妥協。這看起來像:

public function up() 
{ 
    Artisan::call('db:seed', [ 
     '--class' => 'SomeSeeder', 
     '--force' => true ] 
    ); 
} 

這使您可以像移植一樣執行一次種子。您還可以實施防止或增加行爲的邏輯。例如:

public function up() 
{ 
    if (SomeModel::count() < 10) 
    { 
     Artisan::call('db:seed', [ 
      '--class' => 'SomeSeeder', 
      '--force' => true ] 
     ); 
    } 
} 

這顯然會有條件地執行你的播種機,如果少於10個SomeModels。如果您希望將播種機作爲標準播種機加入,該播種機在您撥打artisan db:seed時執行,以及在遷移時不會「加倍」,這非常有用。您也可以創建一個反向播種機,以便回滾按預期工作,例如,

public function down() 
{ 
    Artisan::call('db:seed', [ 
     '--class' => 'ReverseSomeSeeder', 
     '--force' => true ] 
    ); 
} 

第二個參數--force需要啓用到播種機在生產環境中運行。

+1

這是迄今爲止最好的答案。可維護的代碼將問題分開! – helsont

+3

我會仔細考慮從遷移腳本中調用播種器的長期影響。遷移腳本是日期/時間版本,而播種器通常不是。在開發過程中,播種機需求通常會發生變化,導致版本化遷移腳本運行非版本化播種機的可能性 - 打破冪等性。換句話說,每天運行同一組遷移腳本可能會產生不同的結果。 – originalbryan

+0

我發佈了這一段已經有一段時間了,我想提供我們使用這種技術的經驗。總體來說,它對我們來說效果很好,如果我不得不再做一遍,我會的。這就是說有一個需要注意的問題。 @originalbryan是完全正確的,其結果是我們偶爾會遇到遷移新數據庫時遷移破裂的情況,因爲遷移運行的播種機(和模型)比數據庫更新(因爲我們可能會種子在模式完全更新之前)。當發生這種情況時,我們會更新舊遷移來解決問題。 – darrylkuhn