Laravel自定义destroy控制器删除记录ID滞后一位故障排查
异常原因分析
核心问题出在你初始控制器的查询逻辑调用错误:
Car::find($id)方法本身就会根据传入的主键ID直接返回匹配的单个Car模型实例,匹配不到时返回null,调用该方法后你已经拿到了对应ID的Car对象。- 你在
find($id)之后链式调用了->first(),这是错误的根源:Eloquent模型实例调用不存在的方法时会触发魔术方法__call(),自动新建一个不带任何查询条件的Car模型查询构造器,再执行first()获取数据表的第一条记录。
你遇到的删除ID比传入小1的情况,是因为你的数据表默认查询排序规则为ID倒序,无任何条件的first()返回的记录刚好是比你传入测试ID小1的条目,最终导致错误删除。
正确写法说明
两种可行的写法:
- 仅用
find()获取对应模型,去掉多余的first():
public function destroy($id) { $car = Car::find($id); $car->delete(); return redirect('/cars'); }
- 你已经验证可用的路由模型绑定写法,Laravel会自动根据路由参数匹配对应ID的模型实例,无需手动查询,更简洁安全。
内容的提问来源于stack exchange,提问作者gfit21x
相关产品推荐
相关产品推荐

