You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel模型调用报错 提示不存在download_histories数据表

报错根因

Laravel Eloquent 有默认的表名映射规则:模型类名会自动转为蛇形复数格式作为对应数据表名。你的DownloadHistory模型按照规则会默认映射到download_histories表,但你迁移中创建的是单数命名的download_history表,模型查询时找不到默认映射的表,就会抛出对应错误。

除此之外你的代码还存在3个会触发后续报错的配置不匹配问题:

  • 模型$fillable配置中没有加入存储下载记录的字段,无法批量写入该字段内容
  • 模型$casts配置中声明转数组的字段是downloads,但迁移里创建的JSON字段名是history,字段名不匹配
  • 创建DownloadHistory实例时没有给JSON类型的历史记录字段设置默认值,写入时会触发字段非空报错
修复步骤
  1. 在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);
    }
}
  1. 调整注册控制器中的创建逻辑,给历史记录字段传入空数组默认值:
$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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.01 12:42:26