Laravel模型调用报错 提示不存在download_histories数据表
报错根因
Laravel Eloquent 有默认的表名映射规则:模型类名会自动转为蛇形复数格式作为对应数据表名。你的DownloadHistory模型按照规则会默认映射到download_histories表,但你迁移中创建的是单数命名的download_history表,模型查询时找不到默认映射的表,就会抛出对应错误。
除此之外你的代码还存在3个会触发后续报错的配置不匹配问题:
- 模型
$fillable配置中没有加入存储下载记录的字段,无法批量写入该字段内容 - 模型
$casts配置中声明转数组的字段是downloads,但迁移里创建的JSON字段名是history,字段名不匹配 - 创建
DownloadHistory实例时没有给JSON类型的历史记录字段设置默认值,写入时会触发字段非空报错
修复步骤
- 在
DownloadHistory模型中手动指定表名,覆盖默认的复数表名解析规则,同时修正字段配置:
<?php namespace App\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; class DownloadHistory extends Model { use HasFactory; // 手动绑定对应数据表 protected $table = 'download_history'; protected $fillable = [ 'user_id', 'history', ]; protected $casts = [ 'history' => 'array', ]; public function user() { return $this->belongsTo(User::class); } }
- 调整注册控制器中的创建逻辑,给历史记录字段传入空数组默认值:
$downloadHistory = DownloadHistory::create([ 'user_id' => $user->id, 'history' => [] ]); DB::table('users')->where('id', $user->id)->update(['download_history_id' => $downloadHistory->id]);
可选优化:如果想遵循Laravel的默认命名约定,也可以把迁移中的表名改为
download_histories,同时把迁移里的Schema::create和down方法里的表名统一替换,就不需要在模型中手动指定$table属性。
内容的提问来源于stack exchange,提问作者EduardoK
相关产品推荐
相关产品推荐

