在Laravel迁移文件中填充数据库
在Laravel迁移文件中填充数据库
我正在学习 Laravel,已经有一个工作的迁移文件创建了一个 users 表。我试图在迁移中自动填充一个用户记录:
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.example`, 'verified' => true ) ); }); }
但是当运行 php artisan migrate
时,我收到以下错误:
SQLSTATE[42S02]: Base table or view not found: 1146 Table 'vantage.users' doesn't exist
显然,这是因为 Artisan 还没有创建表,但所有文档似乎都说有一种使用 Fluent Query 在迁移的一部分中填充数据的方法。
有人知道怎么做吗?
admin 更改状态以发布 2023年5月22日
我知道这篇文章比较老,但是因为它在谷歌搜索中出现过,所以我想在这里分享一些知识。@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 ] ); } }
如果SomeModels少于10个,则显然有条件地执行种子。这在您想要将种子作为标准种子包含在artisan db:seed
调用时以及在迁移时执行时非常有用,以便您不会“重复”。您还可以创建反向种子以便回滚,例如:
public function down() { Artisan::call( 'db:seed', [ '--class' => 'ReverseSomeSeeder', '--force' => true ] ); }
第二个参数--force
在生产环境中运行种子是必需的。
不要把DB::insert()放在Schema::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.example', 'verified' => true ) ); }