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

Laravel 5复合主键报错:where子句中不存在'id'列

解决Laravel中复合主键更新时报错"Unknown column 'id' in 'where clause'"的问题

这个问题的根源很明确:Laravel Eloquent 默认每个模型都依赖名为id的自增主键,而你的表用的是user_id + tmdb_id的复合主键,模型并没有告知Eloquent这一点,所以当你调用save()更新记录时,Eloquent仍然尝试生成基于id列的WHERE条件,自然就会报错找不到id列。

下面是具体的解决步骤:

1. 配置Movie模型,指定复合主键并关闭自动递增

在你的Movie模型文件中添加以下配置,告诉Eloquent使用复合主键,并且不需要自增主键:

class Movie extends Model
{
    // 关闭自动递增(复合主键不需要自增)
    public $incrementing = false;

    // 指定复合主键字段
    protected $primaryKey = ['user_id', 'tmdb_id'];

    // 可选:如果你的模型有时间戳,确保$timestamps设置正确(默认是true)
    // public $timestamps = true;
}

2. 确认迁移文件中已正确创建复合主键

确保你的迁移文件里已经正确定义了复合主键,比如:

Schema::create('movies', function (Blueprint $table) {
    $table->unsignedInteger('user_id');
    $table->unsignedInteger('tmdb_id');
    $table->float('ratio');

    // 设置复合主键
    $table->primary(['user_id', 'tmdb_id']);

    // 可选:添加外键约束,关联到users表
    $table->foreign('user_id')
          ->references('id')
          ->on('users')
          ->onDelete('cascade');
});

3. 验证更新操作

现在再执行你的更新代码:

$movie = Movie::where([
    'user_id' => 1,
    'tmdb_id' => 2,
])->first();
$movie->ratio = 4;
$movie->save();

Eloquent会正确生成基于user_id和tmdb_id的WHERE条件,不会再去找id列了。

另外补充一点:使用复合主键后,Eloquent的find()方法需要传入主键数组,比如Movie::find([1, 2]),而不是单个值,这点需要注意。

内容的提问来源于stack exchange,提问作者Виталий Комаров

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:03:55