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

Voyager BREAD更新自定义主键报Unknown column 'id'错误排查

Voyager BREAD更新操作1054主键报错排查

问题表现

执行Voyager BREAD更新操作时报错,新增、删除功能运行正常,其他配置相同自定义主键的BREAD无异常,多次调整配置未解决。报错信息如下:

Column not found: 1054 Unknown column 'id' in 'where clause'

对应模型代码

class Kategoriler extends Model
{
    protected $primaryKey = 'kategori_id';
    protected $table = 'kategoriler';
    public $incrementing = false;
    use SoftDeletes;
    protected $dates = ['deleted_at'];
}

问题根因

最初怀疑是核心控制器findOrFail方法默认使用id作为主键查询,但核对VoyagerBaseController的update源码后可以排除该可能:$query->findOrFail($id)是基于模型实例启动的Eloquent查询,会自动读取模型配置的$primaryKey属性,不会硬编码使用id。
结合新增正常、仅更新报错的特征,实际触发点有两个高频场景:

  • 编辑字段的unique验证规则未指定自定义主键:更新操作做唯一性校验时,Laravel会自动拼接where 主键 != 当前记录ID的条件排除当前记录,如果验证规则未显式指定主键,框架会默认使用id作为主键列拼接SQL,直接触发报错。新增操作不需要排除已有记录,因此不会触发该问题。
  • DataType配置的模型scope返回了基础查询构造器:如果配置的scope方法没有返回Eloquent Builder实例,而是直接返回DB::table()生成的基础查询构造器,后续查询会丢失模型的主键、软删除等配置,默认使用id作为查询键。

解决方案

按优先级依次排查修复:

  • 检查BREAD编辑页所有配置了unique验证规则的字段,修改规则格式显式指定自定义主键,示例规则:unique:kategoriler,字段名,NULL,kategori_id,明确告知验证器当前表主键为kategori_id,避免框架默认取id拼接查询条件。
  • 检查模型中对应DataType配置的scope方法,确保所有scope以return $query开头做链式调用,不要直接返回DB::table()实例,保证返回结果为Eloquent查询构造器。
  • 执行缓存清理命令,清除旧配置缓存影响:
php artisan config:clear
php artisan voyager:cache:clear
  • 核对BREAD字段配置,确认kategori_id字段被正确标记为主键,不存在将不存在的id字段误设为主键的配置错误。
  • 如果做了自定义路由模型绑定,检查绑定逻辑是否调用模型的getKeyName()方法获取主键名,不要硬编码id作为查询键。

内容的提问来源于stack exchange,提问作者JrsXcle

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 16:48:45