Laravel 8使用RegisterController向两张表插数据时变量未定义如何解决
Laravel 8 注册同时写入两张表的问题修复
错误原因梳理
- $datos数组初始化时内部调用了未完成定义的$datos本身:你在给$datos赋值的过程中,直接用
$datos['email']、$datos['telefono']这类写法取自身的键,此时$datos还没有完成赋值,对应的键不存在,直接触发未定义错误,所有表单提交的原始值都应该从验证后的$data数组中获取。 - 模型create方法调用语法错误:Laravel的
Model::create()方法只接收一个数组作为批量赋值的参数,你写的Persona::create($datos)([...])属于错误语法,相当于调用create后又将返回的模型实例当做函数二次调用,逻辑完全不成立。 - 冗余重复赋值:你已经在$datos里定义了personas表需要的大部分字段,后续又在create的第二个括号里重复写了一遍,完全没有必要,直接合并为一个数组即可。
修正后的代码
// 第一步:构造personas表需要的所有字段值,所有原始值从$data取 $datos = [ 'nombre' => $data['name'], 'apellido' => $data['surname'], 'cedula' => $data['cedula'], 'email' => $data['email'], 'telefono' => $data['telefono'], 'direccion' => $data['direccion'], 'ciudadResi' => $data['ciudadResi'], 'genero' => $data['genero'], 'fechaNacimiento' => '1998-03-05', 'estado' => '1', 'idTipoPersona' => '2' ]; // 第二步:插入personas表 Persona::create($datos); // 第三步:构造users表需要的字段值,插入users表 User::create([ 'name' => 'clienteUser', 'surname' => $data['surname'], 'email' => $data['email'], 'nick' => $data['nick'], 'password' => Hash::make($data['password']), 'role' => 'cliente' ]);
额外注意事项
- 确保
Persona模型的$fillable属性已经添加了所有你要批量赋值的字段,否则Laravel的批量赋值保护机制会拦截插入操作,示例配置如下:
// Persona.php模型中 protected $fillable = [ 'nombre', 'apellido', 'cedula', 'email', 'telefono', 'direccion', 'ciudadResi', 'fechaNacimiento', 'genero', 'estado', 'idTipoPersona' ];
- 如果后续需要关联查询两个表的数据,可以在users表中新增
persona_id外键字段,插入User时传入Persona创建后生成的主键ID即可,示例:
$persona = Persona::create($datos); User::create([ // 其他字段不变 'persona_id' => $persona->id ]);
内容的提问来源于stack exchange,提问作者Diego Utreras
相关产品推荐
相关产品推荐

