Laravel执行php artisan migrate报QueryException错误如何解决
报错原因
- 核心问题是迁移文件未提前声明
access_id、user_id两个字段,直接创建外键约束。数据库要求必须先存在对应字段,才能在字段上创建外键索引,因此触发字段不存在的报错。 - 存在两个潜在兼容问题需要同步排查:
- 需保证
access、user两张关联表的主键类型与中间表的外键字段类型完全匹配:如果关联表主键是increments(整型自增),外键字段用unsignedInteger;如果是Laravel 7+默认的bigIncrements(长整型自增),外键字段要用unsignedBigInteger,类型不匹配同样会导致外键创建失败。 - 需确认用户表实际表名是否为
user,Laravel默认生成的用户表名为users,如果实际表名与这里写的on('user')不一致,后续也会触发关联表不存在的报错。
- 需保证
修复方案
修改迁移文件代码,先声明字段再创建外键,修改后的完整代码如下:
<?php use Illuminate\Database\Migrations\Migration; use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Facades\Schema; class CreateAccessUser extends Migration { /** * Run the migrations. * * @return void */ public function up() { Schema::create('access_user', function (Blueprint $table) { // 多对多中间表无特殊需求可以去掉单独的id主键 $table->increments('id'); // 先声明外键字段,这里以关联表主键为整型自增为例,长整型自增替换为unsignedBigInteger即可 $table->unsignedInteger('access_id'); $table->unsignedInteger('user_id'); // 定义外键约束 $table->foreign('access_id')->references('id')->on('access'); $table->foreign('user_id')->references('id')->on('user'); // 也可使用Laravel内置的更简洁的外键写法,自动匹配关联表和主键 // $table->foreignId('access_id')->constrained(); // $table->foreignId('user_id')->constrained('user'); // 表名非默认值需手动指定 $table->boolean('status'); $table->timestamp('updated_at'); $table->timestamp('created_at'); $table->string('updated_by'); $table->string('created_by'); }); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::dropIfExists('access_user'); } }
修改完成后,如果之前运行迁移已经生成了部分表,先执行php artisan migrate:rollback回滚未完成的迁移,或者手动删除数据库中已经生成的相关表,再重新执行php artisan migrate即可正常运行。
内容的提问来源于stack exchange,提问作者user16558324
相关产品推荐
相关产品推荐

