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
相关产品推荐
相关产品推荐

