Laravel执行migrate报syntax error, unexpected ':', expecting ')'
报错原因
两个核心问题会触发这个语法错误,另外代码里还有几个会导致后续运行异常的笔误:
- 链式调用笔误:报错行
$table->$table->unsignedInteger(column:'user_id');多写了一层$table->,闭包里已经传入了Blueprint实例$table,直接调用字段方法即可,重复写$table->属于非法语法。 - PHP版本不兼容:代码里使用的
column:'user_id'、value:false是PHP 8.0才支持的命名参数语法,若当前运行环境PHP版本低于8.0,解析器无法识别参数名后的冒号,就会抛出「unexpected ':'」的语法错误。 - 其他笔误:
title字段重复定义了两次- 迁移类不存在
logo()字段方法,无法创建对应字段
解决步骤
- 先在终端执行
php -v确认当前PHP版本:- 若版本低于8.0,二选一即可:升级PHP到8.0及以上(需匹配当前Laravel版本的系统要求,Laravel 9及以上版本必须PHP8.0+);或者移除所有命名参数前缀,直接按顺序传参即可。
- 若版本已经是8.0+,直接修正代码笔误即可。
- 逐行修正迁移文件的错误写法:
- 删除
user_id行多余的$table->调用 - 删除重复定义的
title字段 - 把
$table->logo(column:'logo')改为$table->string('logo'),用于存储logo路径字符串
- 删除
修正后可正常运行的up方法代码
public function up() { Schema::create('listings', function (Blueprint $table) { $table->id(); $table->unsignedInteger('user_id'); $table->string('title'); $table->string('slug'); $table->string('company'); $table->string('location'); $table->string('logo')->nullable(); $table->boolean('is_highlighted')->default(false); $table->boolean('is_active')->default(true); $table->text('content'); $table->string('apply_link'); $table->timestamps(); }); }
如果你使用PHP8.0+环境,保留命名参数写法也可正常运行,比如写成
$table->unsignedInteger(column: 'user_id'),注意冒号后加空格符合PSR规范即可。
内容的提问来源于stack exchange,提问作者Leo
相关产品推荐
相关产品推荐

