Laravel删除foods表记录前如何将关联users表的外键food_id设为null
错误原因分析
- 第一行代码逻辑错误:
User::find()是通过User表的主键id查询用户记录,你传入的是当前用户的foods_id,几乎不可能匹配到对应的用户记录,因此返回null,调用onDelete()自然就会报null对象调用方法的错误 onDelete()是数据库迁移文件中定义外键约束时使用的方法,不属于Eloquent模型实例的方法,即使拿到了正确的User对象,调用这个方法也会报错
正确实现代码
你只需要先把当前认证用户关联的food_id字段置为null,再删除目标food记录即可,代码如下:
// 第一步:将当前登录用户的foods_id字段置空 $user = auth()->user(); $user->foods_id = null; $user->save(); // 第二步:删除对应的foods表记录 $foodDel = Foods::findOrFail($id); // 用findOrFail避免id不存在时调用delete报错 $foodDel->delete();
可选优化:迁移文件配置级联置空(一劳永逸)
如果你在定义users表外键的迁移文件里添加onDelete('set null')约束,后续删除food记录时会自动将关联用户的food_id字段置空,不需要手动处理:
// 迁移文件中定义外键的代码示例 $table->foreignId('foods_id') ->nullable() // 必须先设置字段允许为null,否则set null规则会失效 ->constrained('foods') ->onDelete('set null');
配置完成后,你只需要直接执行删除food的代码即可:
Foods::findOrFail($id)->delete();
内容的提问来源于stack exchange,提问作者Antony_Web
相关产品推荐
相关产品推荐

