PHP/Laravel 8向my_groups表新增行时报1452外键约束错误如何解决?
问题排查与修复方案
问题根源
触发外键约束报错的核心原因是新增数据时传入的是索引数组,没有和表字段名正确关联,导致create()方法没有把groupName和owner_id两个字段的值写入SQL,执行的插入语句仅包含自动生成的created_at、updated_at字段,owner_id为空自然违反非空外键约束。
从报错的SQL语句即可验证:insert into my_groups (updated_at, created_at) values (2021-05-17 19:07:54, 2021-05-17 19:07:54) 中完全没有groupName和owner_id两个字段,说明这两个值都没有被框架识别为合法的字段赋值。
修复方法
把add方法里的$groupData从索引数组改为键名对应字段名的关联数组即可:
public static function add(User $user) { // 改为关联数组,键名要和$fillable里定义的字段名完全一致 $groupData = [ 'groupName' => 'my group', 'owner_id' => $user->id ]; self::create($groupData); return "success"; }
额外验证建议
如果修改后还是报错,可以按以下顺序排查:
- 检查
users表和my_groups表的关联字段类型是否完全匹配:users.id必须是unsignedBigInteger类型,否则就算值存在也会触发外键约束 - 检查传入的
User对象是否是有效存在的用户,可以在add方法里临时加一行dd($user->id)确认是否拿到了正确的用户ID - 确认
MyGroup模型有没有额外重写boot方法、或者加了全局作用域过滤导致写入逻辑被篡改
内容的提问来源于stack exchange,提问作者James Haskell
相关产品推荐
相关产品推荐

