表单提交后数据库没写入,需分三步排查:先确认请求是否抵达控制器,再检查控制器是否执行写入逻辑,最后排查模型$fillable、字段类型及基础配置问题。

表单提交后数据库没写入,不是“没反应”,而是 Laravel 在静默过滤或路由错位。关键要分三步查:看请求有没有进控制器、进控制器后有没有真正执行写入、写入时有没有被安全机制拦住。
第一步:确认请求是否抵达正确控制器方法
打开浏览器开发者工具的 Network 标签页,提交表单后找对应请求,点开看:
- Status 是不是 405(Method Not Allowed)?说明 HTTP 方法不匹配,比如表单用了
@method('PUT'),但路由定义的是Route::post() - Response 中有没有报错信息?比如 “Method does not exist” 或 “Call to undefined method”,说明路由指向了不存在的方法(如写了
storeCat却没在控制器里定义) - URL 和 Method(POST/PUT)是否和
routes/web.php中的定义完全一致?注意路径参数(如{id})是否传了、类型是否匹配
第二步:检查控制器里是否真调用了写入逻辑
在控制器方法开头加一行日志,例如:
Log::info('storeCat called', ['data' => $request->all()]);
提交后查看 storage/logs/laravel.log 是否有这条记录。如果没有,说明请求根本没走到这一步——问题出在路由或中间件;如果有,再往下查:
- 是否用了
Listing::create($data)?确保$data数组里键名和数据库字段一致,且不含空值或类型错误(比如把字符串塞进 INT 字段) - 是否漏写了
return redirect()或response()?虽然不影响写入,但容易误判“没成功” - 是否在事务里写了
DB::transaction()却没 commit?或者事务中途抛异常没 catch,导致自动 rollback
第三步:排查模型和数据库层面的静默拦截
这是最常被忽略的一环:数据看似传进来了,却没进库,往往因为 Eloquent 的批量赋值保护机制生效。
- 检查模型的
$fillable数组,确认所有要写入的字段(如'logo'、'tags')都列在里面;漏掉就会被直接忽略 - 用
dd($request->all())对比模型$fillable,看哪些字段没出现在数组里 - 查数据库字段类型:如果
logo字段是 INT 类型,而你传的是字符串路径,MySQL 会强制转成 0 —— 这就是你看到“存了个 0”的原因 - 运行
php artisan tinker手动试一下:App\Models\Listing::create(['title' => 'test', 'logo' => 'test.png']),看是否报错或字段为空
顺手验证几项基础配置
别跳过这些看似琐碎但高频出问题的点:
-
.env里DB_CONNECTION、DB_DATABASE等是否填对?连错库会导致写进空库或报错不明显 - CSRF Token 是否缺失?表单里有没有
@csrf?没它会被中间件直接拒绝,返回 419 页面 - 修改过配置后有没有清缓存?
php artisan config:clear再试 - storage/logs 目录权限是否足够?
chmod -R 775 storage防止日志写不进去,看不到线索











