Laravel 9迁移创建表时插入数据报错:表不存在,如何解决?
Laravel 9迁移创建表时插入数据报错的解决方案
问题原因
你将数据插入代码写在了Schema::create()的闭包内部。Laravel执行Schema::create()时,会先执行闭包内的表结构定义逻辑,只有当整个闭包执行完毕后,才会在数据库中实际创建出这张表。因此在闭包内调用DB::table('tag_filters')->insert()时,数据库中还不存在目标表,直接触发了「表不存在」的SQL错误。
正确实现方式
方式一:将插入代码移到Schema::create()闭包外部
直接在表创建完成后执行插入操作,确保表已经存在:
public function up() { Schema::create('tag_filters', function (Blueprint $table) { $table->id(); $table->string('tag_name'); $table->string('tag_uri')->nullable(); $table->string('tag_color'); $table->unsignedBigInteger('tag_parent')->nullable(); // 可选:给timestamps设置默认值,避免插入时手动赋值 $table->timestamps()->useCurrent(); $table->foreign('tag_parent')->references('id')->on('tag_filters')->onDelete('cascade'); }); // 表创建完成后执行插入 DB::table('tag_filters')->insert([ [ 'tag_name' => 'javascript', 'tag_color' => 'f9bc64', // 如果没给timestamps设置默认值,需要手动赋值 // 'created_at' => now(), // 'updated_at' => now(), ], ]); }
方式二:使用数据填充(Seeder)适合批量插入场景
如果需要插入大量初始数据,推荐使用Laravel的Seeder机制:
- 创建对应Seeder文件:
php artisan make:seeder TagFiltersSeeder
- 在生成的
TagFiltersSeeder.php中编写插入逻辑:
public function run() { DB::table('tag_filters')->insert([ [ 'tag_name' => 'javascript', 'tag_color' => 'f9bc64', 'created_at' => now(), 'updated_at' => now(), ], // 可添加更多数据条目 ]); }
- 在迁移文件的
up方法末尾调用该Seeder:
public function up() { Schema::create('tag_filters', function (Blueprint $table) { // 表结构定义... }); $this->call(TagFiltersSeeder::class); }
内容的提问来源于stack exchange,提问作者Pouya Vaghefi
相关产品推荐
相关产品推荐

