Laravel关联保存问题:为choices表写入question_id时报错
问题解决:无法将Question的ID写入Choice的question_id字段(报错"Attempt to read property 'id' on int")
错误原因
- 第一个循环
foreach($questions as $question => $question_value)中的$question是数组的整数索引,并非创建后的Question模型实例。循环结束后$question保留最后一个索引值(整数类型),因此第二个循环里调用$question->id会触发类型错误。 - 当前代码未建立问题与选项的对应关系,无法确定每个选项归属哪个问题。
解决方案
核心思路是创建问题后立即使用模型实例的ID关联对应选项,确保每个选项都能正确绑定到所属问题。以下是修正后的代码:
$questions = $request->question; $choices = $request->choices; // 循环创建问题,同时绑定对应选项 foreach ($questions as $index => $questionContent) { // 创建问题并获取模型实例 $question = Question::create([ 'question' => $questionContent, ]); // 获取当前问题对应的选项(需确保前端提交的choices与question索引一一对应) $currentChoices = $choices[$index] ?? []; foreach ($currentChoices as $choiceContent) { Choice::create([ 'question_id' => $question->id, // 这里使用模型实例的ID,而非循环索引 'choice' => $choiceContent, ]); } }
额外注意事项
- 确保模型设置可填充字段:
- Question模型:
protected $fillable = ['question']; - Choice模型:
protected $fillable = ['question_id', 'choice'];
- Question模型:
- 验证前端请求结构:需保证
question数组和choices数组的索引一一对应,即questions[0]的选项对应choices[0]的数组内容。
内容的提问来源于stack exchange,提问作者Ryan R
相关产品推荐
相关产品推荐

