Laravel提交CRUD表单时报错SQLSTATE[42S02] Table 'hr.staff'不存在
错误原因
- 模型类名与控制器调用的类名不一致:你定义的模型类为
Staffs,但StaffController的store方法中调用的是Staff::create(),Laravel会根据调用的Staff类名自动推导对应表名为单数的staff,和你实际创建的staffs表不匹配,因此触发表不存在的报错。 - 未显式指定模型绑定表名:Laravel默认规则是将模型类名转为蛇形复数作为对应表名,如果类名不符合默认规范又没有手动指定表名,就会出现自动推导的表名和实际表名不一致的问题。
解决方案
- 统一类名调用,遵循Laravel命名规范(推荐):
将模型类名从Staffs改为Staff,符合「模型单数、表名复数」的默认约定,控制器中Staff::create()的调用无需修改,Laravel会自动推导对应表名为staffs,和你迁移创建的表名匹配。 - 保持现有模型类名的修正方案:
如果你不想修改模型类名,直接将控制器中Staff::create()改为Staffs::create(),同时确保控制器顶部的use语句导入的是正确的Staffs模型类即可。 - (可选)显式绑定表名避免推导错误:
无论选择上述哪种方案,都可以在模型类中添加以下属性,直接指定绑定的表名,彻底避免自动推导出错:
protected $table = 'staffs';
- 配置缓存清理:
修改完成后如果仍报错,执行以下命令清理缓存即可:
php artisan config:clear php artisan cache:clear
内容的提问来源于stack exchange,提问作者Daisy
相关产品推荐
相关产品推荐

