Laravel注册提交报错SQLSTATE[42S02] 提示ums.people表不存在
报错信息
SQLSTATE[42S02]: Base table or view not found: 1146 Table 'ums.people' doesn't exist
问题背景
搭建简易注册登录系统时,已完成前端表单开发与数据库创建:使用的数据库名为ums,库中实际创建的用户表名为persons,预期注册提交时向persons表插入用户数据。点击注册按钮时触发上述报错,框架提示找不到ums.people表。
问题根因
这是Laravel框架Eloquent ORM的默认表名映射规则导致的:
控制器代码中通过$p1 = new Person();实例化了Person模型,Eloquent默认会将模型类名转为蛇形复数格式作为对应的数据库表名,Person转换后的结果就是people,因此框架会自动查询ums.people表,和你实际创建的persons表名不匹配,最终抛出表不存在的错误。
修复方案
直接在Person模型文件中显式指定绑定的表名即可,这是最稳妥的改法,不需要调整已建好的数据库表结构:
- 找到项目中存放模型的目录(通常是
app/Models/)下的Person.php文件 - 在模型类中添加
$table属性指定关联表为persons,同时建议配置$fillable属性开启字段白名单,避免后续保存数据时触发批量赋值报错:
<?php namespace App\Models; use Illuminate\Database\Eloquent\Model; class Person extends Model { // 手动指定模型关联的数据库表名,覆盖框架默认的复数映射规则 protected $table = 'persons'; // 配置允许批量赋值的字段 protected $fillable = ['name', 'email', 'password', 'type']; }
修改保存后重新提交注册请求即可正常写入数据。
额外提示:当前代码中用户密码是明文存储的,正式使用前建议调用bcrypt($req->password)对密码做哈希处理再存入数据库,避免安全风险。
相关业务代码参考
注册提交控制器方法
function regSubmit(Request $req) { @$this->validate($req, [ "name"=>"required|max:20|regex:/^[a-zA-Z]+(([',. -][a-zA-Z ])?[a-zA-Z]*)*$/", "email"=>"required|regex:/^([1-9]{2}-[0-9]{5}-[1-3]{1})\@student\.aiub\.edu+$/", "password"=>"required|min:8|regex:/^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[a-zA-Z]).{8,}$/", "conf_password"=>"required|same:password", "type"=>"required" ], [ "name.required"=> "Please Enter Your Name", "name.max"=> "Maximum 20 Characters", "name.regex"=>"Please Enter A Valid Name", "email.required"=>"Please Enter Your Email Address", "email.regex"=>"Please Enter A Valid Email Address", "password.required"=>"Please Enter A Password", "password.min"=>"Minimum 8 Characters", "password.regex"=>"password must contain a special character, a number and an uppercase letter", "conf_password.required"=>"Please Confirm Your Password", "conf_password.same"=>"Password do not match", "type.required"=>"Please Enter User Type" ] ); $p1 = new Person(); $p1->name = $req->name; $p1->email = $req->email; $p1->password = $req->password; $p1->type = $req->type; $p1->save(); return redirect('users.login'); }
注册表单前端代码
@extends('layouts.logoutlay') @section('content') <form action ="{{route('users.reg.submit')}}" method="post" style="margin: auto; width: 220px;"> {{@csrf_field()}} Name: <input type = "text" value = "{{old('name')}}" name ="name"></br> @error('name') <span class="text-danger">{{$message}}</span><br> @enderror Email: <input type = "text" value = "{{old('email')}}" name ="email"></br> @error('email') <span class="text-danger">{{$message}}</span><br> @enderror Password: <input type="password" value = "{{old('password')}}" name="password"></br> @error('password') <span class="text-danger">{{$message}}</span><br> @enderror Confirm Password : <input type="password" value = "{{old('conf_password')}}" name="conf_password"></br> @error('conf_password') <span class="text-danger">{{$message}}</span><br> @enderror Type : <input type="radio" value="user" name="type"> User <input type="radio" value="admin" name="type"> Admin </br> @error('type') <span class="text-danger">{{$message}}</span><br> @enderror </br> <input type="submit" value="Register"> </form> @endsection
内容的提问来源于stack exchange,提问作者Mehedi Hasan Talha
相关产品推荐
相关产品推荐

