在Laravel迁移文件中填充数据库

我刚刚学习Laravel,并有一个工作迁移文件创build一个用户表。 我正在试图填充用户logging作为迁移的一部分:

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' => 'name@domain.com', 'verified' => true ) ); }); } 

但是运行php artisan migrate时出现以下错误:

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

这显然是因为Artisan还没有创build表格,但是所有的文档似乎都认为有一种使用Fluent Query来迁移数据的方式。

任何人都知道? 谢谢!

不要把DB :: insert()放到Schema :: create()里面,因为create方法必须在插入东西之前完成表的生成。 试试这个:

 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' => 'name@domain.com', 'verified' => true ) ); } 

我知道这是一个旧的职位,但因为它出现在谷歌search我想我会在这里分享一些知识。 @ erin-geyer指出,混合迁移和播种器可能会令人头痛,@ justamartin反驳说,有时候您希望/需要将数据填充为部署的一部分。

我会更进一步说,有时候最好能够一致地推出数据更改,以便您可以部署到分段,看到一切正常,然后部署到生产中,并放心地输出相同的结果(而不必记得运行一些手动步骤)。

然而,把种子和迁徙分离出来还是有价值的,因为这是两个相关而又不同的关切。 我们的团队通过创build称为播种机的迁移来妥协。 这看起来像:

 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 ] ); } } 

如果less于10个SomeModels,这显然有条件地执行你的播种机。 如果您希望将播种器作为标准播种器join,此播种器在您调用artisan db:seed以及在迁移时不会执行“双倍播放”,将会很有用。 您也可以创build一个反向播种机,使回滚按预期工作,例如

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

需要第二个参数--force才能使播种机在生产环境中运行。

这里有一个非常好的解释,为什么使用Laravel的数据库播种机优于使用迁移: http ://laravelbook.com/laravel-database-seeding/

虽然遵循官方文档的指示是一个好得多的想法,因为上述链接中描述的实现似乎不起作用,而且是不完整的。 http://laravel.com/docs/migrations#database-seeding

这应该做你想要的。

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

试试:(未testing)

 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' => 'name@domain.com', 'verified' => true ) ); }); }