2012-10-04 39 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