Laravel8 + Vuex 发起POST请求返回500内部服务器错误求助
问题根因
你看到的500错误核心原因是Laravel模型默认会自动维护created_at和updated_at两个时间戳字段,但你的迁移文件中没有创建这两个字段,执行SQL插入时找不到对应字段触发报错。
解决方案
修复时间戳错误(二选一即可)
- 方案1(推荐,保留时间戳):修改迁移文件,在表结构定义中加入时间戳字段,重新执行迁移:
// 迁移文件up方法内新增 $table->timestamps();
开发环境可执行php artisan migrate:fresh重建表结构(注意会清空所有表数据),生产环境建议新建迁移文件单独添加两个timestamp类型字段。
- 方案2(不需要时间戳):在
StreamingProvider模型中关闭自动维护时间戳的功能,新增一行配置:
public $timestamps = false;
你的两个疑问解答
- 保存数据到DB前是否需要手动做类型转换?
不需要。Laravel的模型$casts配置会自动完成类型转换,你提交的布尔值会自动转为数据库存储需要的0/1数值,读取时也会自动转回布尔类型返回。注意你当前模型的属性名拼写错误,你写的是$cast,正确属性名是$casts,修正后类型转换才会生效。 - 布尔类型的属性是否需要加入
$fillable配置?
需要。$fillable是Laravel的批量赋值白名单,和字段类型无关,只要你需要给字段赋值、或者使用create等批量写入方法,都需要把对应字段加入$fillable,也可以设置protected $guarded = []放开所有字段的批量赋值限制。
其他优化建议
- 迁移文件中
user_id字段类型错误,你当前定义的是string类型,和用户表的自增bigint类型不匹配,建议修改为:
$table->unsignedBigInteger('user_id'); // 可额外加外键约束 $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
- 控制器
addStreamingProviders方法的参数StreamingProvider $userStreamingProviders是无效冗余的,你后续重新new了模型实例,完全没有用到路由模型绑定注入的对象,可以直接删掉该参数。 - 控制器赋值逻辑可简化,增加参数校验后用批量赋值减少重复代码:
public function addStreamingProviders(Request $request) { $validated = $request->validate([ 'Netflix' => 'boolean', 'Amazon Prime Video' => 'boolean', 'Sky Ticket' => 'boolean', 'Disney Plus' => 'boolean', 'HBO Video' => 'boolean', ]); $provider = StreamingProvider::create(array_merge($validated, [ 'user_id' => auth()->id() ])); return response()->json(['streamingProviders' => $provider]); }
- Vue代码中不要用jQuery获取select选中值,改用Vue的v-model绑定更符合规范:给select标签加
v-model="selectedCountry",在data中新增selectedCountry: '',提交时直接用this.selectedCountry取值即可。 - 你的提交逻辑中
updateUserStreamingProviders和updateCountry是两个并行的异步请求,直接等updateCountry的then可能出现updateUserStreamingProviders还没执行完就跳转的问题,建议用Promise.all包裹两个请求,等都执行完成后再跳转。
内容的提问来源于stack exchange,提问作者Lluís Mañas
相关产品推荐
相关产品推荐

