Laravel如何按给定结构将两个字段分别存入两张不同的关联表
问题根源
- 你的控制器
store方法仅执行了table1对应模型EnviarCurriculum的写入操作,完全没有调用table2对应模型EnviarCurriculumPreguntas的写入逻辑,自然第二个表不会有数据。 - 模型关联定义错误:如果
table1是主表、table2是关联从表,EnviarCurriculum对应的关联方法应该用hasOne而非belongsTo,且你没有手动指定自定义的主键、外键字段,Laravel默认会按模型名_id的规则找关联字段,和你自定义的ID_tableX格式不匹配。 - 代码中直接调用
$request->validated()但没有定义请求验证规则,实际运行中该方法会返回空或者抛出异常,你没有看到报错大概率是简化代码时漏掉了验证逻辑。
修改步骤
1. 修正模型关联
修改EnviarCurriculum.php的关联方法,注意替换下方的table1_foreign为你table2中实际存储的、关联table1主键ID_table1的外键字段名:
namespace App; use Illuminate\Database\Eloquent\Model; class EnviarCurriculum extends Model { protected $table = 'table1'; protected $primaryKey = 'ID_table1'; protected $fillable = [ 'nif' ]; public function enviarcurriculumpreguntas() { // 第一个参数为关联模型,第二个为从表外键,第三个为主表主键 return $this->hasOne(EnviarCurriculumPreguntas::class, 'table1_foreign', 'ID_table1'); } }
同时在EnviarCurriculumPreguntas.php中补充关联反向定义,且把外键字段加入fillable:
namespace App; use Illuminate\Database\Eloquent\Model; class EnviarCurriculumPreguntas extends Model { protected $table = 'table2'; protected $primaryKey = 'ID_table2'; protected $fillable = [ 'nif_table2', 'table1_foreign' // 这里加你实际的外键字段名 ]; public function enviarcurriculum() { return $this->belongsTo(EnviarCurriculum::class, 'table1_foreign', 'ID_table1'); } }
2. 修改控制器存储逻辑
修改EnviarCurriculumController.php的store方法,补充验证逻辑和从表写入操作:
public function store(Request $request) { // 补充请求验证规则 $validated = $request->validate([ 'nif' => 'required|string|max:255', 'nif_table2' => 'required|string|max:255', ]); // 写入主表table1 $curriculum = EnviarCurriculum::create($validated); // 通过关联写入从表table2 $curriculum->enviarcurriculumpreguntas()->create([ 'nif_table2' => $validated['nif_table2'] ]); // 后续可以加跳转或者返回响应逻辑 return redirect()->back()->with('success', '提交成功'); }
3. 数据库校验
确认table2表中已经创建了对应关联table1主键ID_table1的外键字段,字段名和你上面代码中填的table1_foreign保持一致。
内容的提问来源于stack exchange,提问作者El conde Lucanor
相关产品推荐
相关产品推荐

