Laravel7执行update方法出现Illegal string offset 'id'错误如何解决
错误原因
- 核心触发点在Filter实例的创建逻辑:你使用
firstOrCreate(['id' => $item['id'] ?? null]),当新增筛选项(前端未传递id参数)时,查询条件为id = null,数据库不存在对应记录就会尝试创建id为null的行。而id作为主键默认是非空自增属性,直接触发主键约束报错。 - 关联值更新存在相同隐患:新增筛选值时如果未传递
id,updateOrCreate方法会传入id = null的查询条件,触发关联表的主键约束错误。 - 额外需要注意:如果模型未配置
$fillable批量赋值属性,fill()方法会自动过滤传入的字段,也会导致保存时报空字段错误。
修复方案
1. 替换Filter实例获取逻辑
用Laravel自带的findOrNew方法替代原有逻辑,该方法会在传入id存在时返回对应实例,不存在时返回新的空实例,不会触发主键错误:
将原代码中的
$filter_item = Filter::query()->firstOrCreate(['id' => $item['id'] ?? null]);
替换为:
$filter_item = Filter::findOrNew($item['id'] ?? null);
2. 修改关联值更新逻辑
区分已有值和新增值的处理逻辑,避免传入null的id查询条件:
将原代码中的
foreach($item['value'] as $value) { $filter_item->values()->updateOrCreate( ['id' => $value['id']], ['value' => $value['value']] ); }
替换为:
foreach($item['value'] as $value) { if (isset($value['id'])) { // 已有值走更新逻辑 $filter_item->values()->updateOrCreate( ['id' => $value['id']], ['value' => $value['value']] ); } else { // 新增值直接创建 $filter_item->values()->create([ 'value' => $value['value'] ]); } }
3. 补充检查项
- 确认
Filter模型的$fillable属性中已添加category_id、name、latin、field字段 - 确认关联值对应模型的
$fillable属性中已添加value字段 - 确认
Filter模型中已正确定义values()关联关系
内容的提问来源于stack exchange,提问作者user17301916
相关产品推荐
相关产品推荐

