Laravel控制器插入数据无报错但未存储,求问题排查
Laravel数据插入无报错但未存储问题排查
问题定位与修复方案
1. 字段名不匹配(直接导致插入失败)
迁移表中事件关联字段是events_id,但控制器里赋值的是$time->event_id = '1';——少了一个s,导致这个必填外键字段未被赋值,违反数据库约束。但因为Laravel默认未强制抛出异常,所以没报错。
修复:把控制器里的event_id改成events_id。
2. 模型关联多处错误
- 关联关系类型错误:
Time表的user_id、leaderboard_id、events_id是外键,对应关系应该是belongsTo,不是hasOne——hasOne是当前模型拥有另一个模型的记录,而这里是Time属于某个用户/排行榜/事件。 - 参数顺序颠倒:
hasOne/belongsTo的参数顺序是「关联模型类,外键字段,当前模型主键」,你写反了。 - 拼写错误:
Leaderboard关联里的模型类写成了Leadeboard(少了r),会导致类找不到。 - 大小写不匹配:关联里的
User_id、Events_id应该和数据库字段一致,用小写user_id、events_id。
3. 调试建议
- 开启
.env里的APP_DEBUG=true,能看到具体SQL错误。 - 用
$time->saveOrFail()代替$time->save(),强制抛出异常,直接定位问题。 - 插入前可以用
dd($time->getErrors())查看验证错误。
修正后代码示例
控制器代码
public function store3(){ $time = new Time; $time->leaderboard_id = '1'; $time->user_id = '1'; $time->events_id = '1'; // 修正字段名 $time->time = '1'; $time->avg = '1'; $time->saveOrFail(); // 强制抛出异常,便于调试 return $this->scramble3(0); }
模型代码
class Time extends Model { use HasFactory; protected $table = "time"; protected $fillable = [ 'user_id', 'leaderboard_id', 'events_id', 'time', 'avg' ]; // 修正关联关系为belongsTo,参数、命名、拼写全部修正 public function user(){ return $this->belongsTo(User::class, 'user_id'); } public function leaderboard(){ return $this->belongsTo(Leaderboard::class, 'leaderboard_id'); } public function event(){ return $this->belongsTo(Event::class, 'events_id'); } }
内容的提问来源于stack exchange,提问作者Nicholas Vigo
相关产品推荐
相关产品推荐

