Laravel Backpack Pro子字段多对多关系保存报列不存在错误
Laravel Backpack Pro 嵌套关系子字段保存异常修复
问题场景
关联链路:Event 模型与 Badge 模型为一对多关联,Badge 模型与 Package 模型为多对多关联。业务需求为在Event的CRUD页面中,直接维护Event关联的Badge,同时为每个Badge绑定对应的关联Package。
保存时触发SQL报错:
SQLSTATE[42S22]: Column not found: 1054 Unknown column 'packages' in 'field list' update `badges` set `packages` = ["1"], `badges`.`updated_at` = 2022-06-28 22:40:36 where `id` = ?
现有配置如下:
EventCrudController 字段配置:
CRUD::field('badges') ->type('relationship') ->subfields([ [ 'name' => 'packages', 'type' => "relationship", // 可选配置项 // 'label' => "分类", // 'attribute' => "title", // 下拉选项展示的模型字段 // 'placeholder' => "请选择分类", ], ]);
Badge模型关联定义:
class Badge extends Model { use \Backpack\CRUD\app\Models\Traits\CrudTrait; public $guarded = []; public function packages() { return $this->belongsToMany(Package::class,'badge_package'); } }
已排查确认:
- Tinker环境下可正常执行Badge与Package的多对多关联挂载操作
- 后台管理页关联选项加载展示完全正常
- 仅表单提交保存时触发上述错误
报错根因
该问题不属于框架Bug,为配置缺失导致:Backpack的relationship类型字段作为一对多关系的子字段时,默认会将字段名识别为模型表的直存字段写入,不会自动识别多对多关联走中间表同步逻辑,必须显式声明子字段对应的关系类型。
修复方法
在packages子字段配置中新增'relation_type' => 'BelongsToMany'参数,显式告知Backpack该字段对应多对多关联,保存时走中间表关联同步逻辑,而非直接写入badges表的字段:
CRUD::field('badges') ->type('relationship') ->subfields([ [ 'name' => 'packages', 'type' => "relationship", 'relation_type' => 'BelongsToMany', // 新增该行配置 // 可选配置项 // 'label' => "关联套餐", // 'attribute' => "title", // 'placeholder' => "请选择关联套餐", ], ]);
若添加配置后仍异常,检查两点:
- 确认Badge模型未将
packages加入$fillable白名单(当前使用$guarded = []无该问题),避免框架误判为可批量赋值的表字段 - 确认Backpack Pro版本不低于5.3.0,早期版本对一对多嵌套下的多对多关系子字段支持存在已知缺陷,升级到稳定版即可解决
内容的提问来源于stack exchange,提问作者Martin Becker
相关产品推荐
相关产品推荐

